针对Angular2RC2如何将路由器注入自定义ExceptionHandler和angularservice注入这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展"Unhandle
针对Angular 2 RC 2如何将路由器注入自定义ExceptionHandler和angular service注入这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展"Unhandled exception in app.exe (QtGuid4.dll): 0xC0、@ExceptionHandler 异常处理、Angular 4,自定义ErrorHandler无法识别自定义错误、Angular2 RC.1 – 将路由器注入单元测试等相关知识,希望可以帮助到你。
本文目录一览:- Angular 2 RC 2如何将路由器注入自定义ExceptionHandler(angular service注入)
- "Unhandled exception in app.exe (QtGuid4.dll): 0xC0
- @ExceptionHandler 异常处理
- Angular 4,自定义ErrorHandler无法识别自定义错误
- Angular2 RC.1 – 将路由器注入单元测试
Angular 2 RC 2如何将路由器注入自定义ExceptionHandler(angular service注入)
Error: Error: Cannot resolve all parameters for ‘ErrorHandler'(?).
Make sure that all the parameters are decorated with Inject or have
valid type annotations and that ‘ErrorHandler’ is decorated with
Injectable.
我确实试过装饰私有路由器:使用@Inject的路由器无济于事.我正在使用打字稿,因此我认为我不需要@Inject属性.
我的自定义ExceptionHandler看起来像这样
import { ExceptionHandler } from '@angular/core'; import { Router } from '@angular/router'; export class ErrorHandler extends ExceptionHandler{ constructor( private router: Router ){ super(null,null); } call(error,stackTrace = null,reason = null) { console.log(error); this.router.navigate(['/error']); } }
我的主要看起来像这样
import { bootstrap } from '@angular/platform-browser-dynamic'; import { AppComponent } from './app.component'; import { provide,ExceptionHandler } from '@angular/core'; import { ErrorHandler } from './error-handler/error-handler'; import { HTTP_PROVIDERS } from '@angular/http'; import { ROUTER_PROVIDERS } from '@angular/router'; bootstrap(AppComponent,[ HTTP_PROVIDERS,ROUTER_PROVIDERS,provide(ExceptionHandler,{useClass: ErrorHandler}) ]);
为什么我收到此错误?在ExceptionHandler实例化时,路由器是否可注入?
完整的源代码可在此处获得
https://github.com/harindaka/angular2-seed-typescript/tree/b368315ce6608085f3154a03bc53f0404ce16495
解决方法
import { ErrorHandler,Injectable } from '@angular/core'; @Injectable() export class GlobalErrorHandler implements ErrorHandler { private myService: MyService; constructor(private injector: Injector) { this.myService = injector.get(MyService); } handleError(error) { alert('Bad things happening'); } } @NgModule({ providers: [ { provide: ErrorHandler,useClass: GlobalErrorHandler } ] }) export class AppModule { }
注意:上面的答案使用ExceptionHandler,它在最终版本中被删除,有利于ErrorHandler.
"Unhandled exception in app.exe (QtGuid4.dll): 0xC0
本文要 解决 的Qt调试问题截图如下: 起因 :在代码中添加类型为QColor的二维数组,存储图片每个像素。 现象 :调试时出现上图所示 错误 。 原因 :经过百度以及反复查看代码,发现在代码中,有数组越界的情况。因为定义的时候,数组的两个维度大小不一样,
本文要解决的qt调试问题截图如下:
起因:在代码中添加类型为QColor的二维数组,存储图片每个像素。
现象:调试时出现上图所示错误。
原因:经过百度以及反复查看代码,发现在代码中,有数组越界的情况。因为定义的时候,数组的两个维度大小不一样,而在实
现 QWidget的重画事件时,因为坐标系的差别,使得两个维度的顺序对换,使得发生数组越界的情况。
详细解释:在程序中我定义的数组是QColor color [ Height ] [ Width ], 我的本意是Height代表图片的高度,Height的初值为400;Width
代表图片的高度,Width的初值为600。
然而在Qt的paintEvent事件中,QPainter中的 drawPoint( int x,int y )函数中,x表示的是图片的横坐标,对应数组的Width;
y表示图片的纵坐标,对应数组的Height。
由于在刚开始没有意识到坐标系与数组维度的对应关系,使得对应错误,导致越界。
如有疑问,请留言!如有问题,求指正!
@ExceptionHandler 异常处理
有时候我们想统一处理一个Controller中抛出的异常怎么搞呢?
直接在Controller里面加上用@ExceptionHandler标注一个处理异常的方法像下面这样子
@ExceptionHandler(MissingServletRequestParameterException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void processMethod(MissingServletRequestParameterException ex,HttpServletRequest request ,HttpServletResponse response) throws IOException {
System.out.println("抛异常了!"+ex.getLocalizedMessage());
logger.error("抛异常了!"+ex.getLocalizedMessage());
response.getWriter().printf(ex.getMessage());
response.flushBuffer();
}
这样,Controller里面的方法抛出了MissingServletRequestParameterException异常就会执行上面的这个方法来进行异常处理。 像我下面的代码
@RequestMapping("/index")
public String index(@MyUser User user,@RequestParam String id,ModelMap modelMap){
return "login";
}
如果我没有传入id值,那么就会抛出MissingServletRequestParameterException的异常,就会被上面的异常处理方法处理。
上面的@ExceptionHandler(MissingServletRequestParameterException.class)这个注解的value的值是一个Class[]类型的,这里的ExceptionClass是你自己指定的,你也可以指定多个需要处理的异常类型,比如这样@ExceptionHandler(value = {MissingServletRequestParameterException.class,BindException.class}),这样就会处理多个异常了。
但这个只会是在当前的Controller里面起作用,如果想在所有的Controller里面统一处理异常的话,可以用@ControllerAdvice来创建一个专门处理的类。
Angular 4,自定义ErrorHandler无法识别自定义错误
应用程序错误处理程序(只是重要的部分)
@Injectable() export class ApplicationErrorHandler extends ErrorHandler { constructor(private injector: Injector) { super(false); } handleError(error: any): void { if (error instanceof ApplicationError || error.originalError instanceof ApplicationError) { this.addError(error.originalError); } else { super.handleError(error); } }
应用模块
providers: [ { provide: ErrorHandler,useClass: ApplicationErrorHandler } ],
app.component(只有重要部分)
public ngOnInit(): void { const error = new ApplicationError(); error.message = "fehler"; throw error; }
应用程序错误
export class ApplicationError implements Error { name: string; message: string; httpStatus?: number = 404; applicationStatus?: number; errorMessageTranslationkey: string; handled: boolean = false; }
在我的app.component中我抛出一个ApplicationError(在ngOnInit中),我的ErrorHandler被成功调用.
但是我在handleError中的错误总是类型为Error并且error.originalError始终是未定义的,无论我是否抛出自定义错误,if if将永远不会解析为true.
我不知道为什么以及如何发生这种情况.
我看到错误得到了,所以我假设,包装因为我调试时看到错误:错误:[object:Object] at viewWrappedDebugError(vendor.bundle.js)
知道什么可能导致这个问题以及我如何解决它?
编辑
怀疑它与Debugmode有关.只要我使用enableProdMode()启用prodmode;它按预期工作.
这仍然没有真正回答我的问题.
如何在angular的调试模式下处理自定义错误?
您可以使用以下代码来创建自定义错误:
export class ApplicationError extends Error { httpStatus?: number = 404; applicationStatus?: number; errorMessageTranslationkey: string; handled: boolean = false; constructor(message?: string) { super(message); this.name = ApplicationError.name; Object.setPrototypeOf(this,ApplicationError.prototype); } }
与创建自定义错误的主题相关,还要检查这些链接,以便对主题有完整的了解:
> extending Error,Array,Map in TypeScript引用here
> Error – Custom Error Types section
为什么这需要成为错误的实例?
因为您的错误通过以下方法:
function viewWrappedDebugError(err,context) { if (!(err instanceof Error)) { // errors that are not Error instances don't have a stack,// so it is ok to wrap them into a new Error object... err = new Error(err.toString()); } _addDebugContext(err,context); return err; }
代码可在errors.ts
获得.
因此,如果您没有抛出Error实例,则会创建一个新实例.
在ErrorHandler中拦截未捕获的promise
另一个错误情况是从Angular生命周期调用的方法返回一个被拒绝的promise(例如:handler,lifecycle-hook).
export class AppComponent implements OnInit { ngOnInit() { return new Promise((resolve,reject) => reject(new ApplicationError())); } }
因此,错误处理代码可能如下所示:
import {ErrorHandler,Injectable,Injector} from "@angular/core"; import {ApplicationError} from "./ApplicationError"; @Injectable() export class ApplicationErrorHandler extends ErrorHandler { private errors: ApplicationError[] = []; constructor(private injector: Injector) { super(false); } handleError(error: any): void { if (error instanceof ApplicationError) { this.addError(error); } else { if(error.rejection instanceof ApplicationError) { this.addError(error.rejection); } else { super.handleError(error); } } } addError(error: ApplicationError) { this.errors.push(error); } }
Angular2 RC.1 – 将路由器注入单元测试
但是,当我运行我的测试用例时,我在尝试注入路由器时遇到错误.我究竟做错了什么?谁能提供一个有效的例子?
我正在使用angular2-RC.1
这是我得到的错误:
没有ComponentResolver的提供者! (路由器 – > ComponentResolver)
这是我的测试:
import {describe,it,expect,beforeEach,afterEach,beforeEachProviders,inject} from "@angular/core/testing"; import {ReflectiveInjector,provide} from "@angular/core"; import {HTTP_PROVIDERS} from "@angular/http"; import {Router,ROUTER_PROVIDERS} from "@angular/router"; import {ROUTER_FAKE_PROVIDERS} from "@angular/router/testing"; import {Location} from "@angular/common"; import {SpyLocation} from "@angular/common/testing/location_mock"; import {Observable} from "rxjs/Observable"; import {MyComp} from "./MyComp"; describe("MyComp",() => { let injector: ReflectiveInjector,myComp: MyComp,router: Router; beforeEach(() => { injector = ReflectiveInjector.resolveAndCreate([ HTTP_PROVIDERS,ROUTER_FAKE_PROVIDERS,provide(Location,{useClass: SpyLocation}) ]); router = injector.get(Router); myComp = new MyComp(router); }); afterEach(() => { injector = null; myComp = null; router = null; }); it("should be defined",() => { expect(myComp).tobedefined(); }); });
解决方法
import { AppComponent } from './app.component'; import {Router,ROUTER_PROVIDERS} from "@angular/router"; describe('app component',() => { let component: AppComponent; let router: Router; beforeAll(() => { router = jasmine.createSpyObj("Router",['navigate']); component = new AppComponent(router); }); it("should be defined",() => { expect(component).tobedefined(); }); });
我们今天的关于Angular 2 RC 2如何将路由器注入自定义ExceptionHandler和angular service注入的分享就到这里,谢谢您的阅读,如果想了解更多关于"Unhandled exception in app.exe (QtGuid4.dll): 0xC0、@ExceptionHandler 异常处理、Angular 4,自定义ErrorHandler无法识别自定义错误、Angular2 RC.1 – 将路由器注入单元测试的相关信息,可以在本站进行搜索。
本文标签: