GVKun编程网logo

Angular 2 RC 2如何将路由器注入自定义ExceptionHandler(angular service注入)

3

针对Angular2RC2如何将路由器注入自定义ExceptionHandler和angularservice注入这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展"Unhandle

针对Angular 2 RC 2如何将路由器注入自定义ExceptionHandlerangular service注入这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展"Unhandled exception in app.exe (QtGuid4.dll): 0xC0、@ExceptionHandler 异常处理、Angular 4,自定义ErrorHandler无法识别自定义错误、Angular2 RC.1 – 将路由器注入单元测试等相关知识,希望可以帮助到你。

本文目录一览:

Angular 2 RC 2如何将路由器注入自定义ExceptionHandler(angular service注入)

Angular 2 RC 2如何将路由器注入自定义ExceptionHandler(angular service注入)

我正在使用Angular 2 RC2.我需要将Angular 2路由器注入我的自定义ExceptionHandler类.但是我收到以下错误

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

解决方法

见: ErrorHandler班.您可以添加Injectable装饰器来实现DI!

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

"Unhandled exception in app.exe (QtGuid4.dll): 0xC0

本文要 解决 的Qt调试问题截图如下: 起因 :在代码中添加类型为QColor的二维数组,存储图片每个像素。 现象 :调试时出现上图所示 错误 。 原因 :经过百度以及反复查看代码,发现在代码中,有数组越界的情况。因为定义的时候,数组的两个维度大小不一样,

本文要解决的qt调试问题截图如下:

"Unhandled exception in app.exe (QtGuid4.dll): 0xC0

 

起因:在代码中添加类型为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 异常处理

@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无法识别自定义错误

Angular 4,自定义ErrorHandler无法识别自定义错误

我尝试创建自定义全局 ErrorHandler并遵循详细说明 here

应用程序错误处理程序(只是重要的部分)

@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的调试模式下处理自定义错误?

您遇到此问题,因为ApplicationError不是错误.

您可以使用以下代码来创建自定义错误:

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 – 将路由器注入单元测试

我正在编写我的ng2测试,我遇到了一些麻烦,将Router注入我的组件进行测试.我的组件的构造函数只接受一个参数 – 私有路由器:路由器.

但是,当我运行我的测试用例时,我在尝试注入路由器时遇到错误.我究竟做错了什么?谁能提供一个有效的例子?

我正在使用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();

  });



});

解决方法

您需要为路由器创建一个jasmine间谍对象. AppComponent有一个接收路由器的构造函数.

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如何将路由器注入自定义ExceptionHandlerangular service注入的分享就到这里,谢谢您的阅读,如果想了解更多关于"Unhandled exception in app.exe (QtGuid4.dll): 0xC0、@ExceptionHandler 异常处理、Angular 4,自定义ErrorHandler无法识别自定义错误、Angular2 RC.1 – 将路由器注入单元测试的相关信息,可以在本站进行搜索。

本文标签: