如何告诉Angular 2在遇到异常时不阻止整个应用程序?
我不确定它是否可能,因为谷歌并没有在这方面给我启发。 但它似乎对任何单页Web应用程序都至关重要。
每当Angular 2遇到异常并抛出错误时,整个应用程序就会无响应。
我在JavaScript中知道
try {
doSomething();
}
catch(err) {
handleErrors(err);
}
可能会解决问题。
但我只想知道是否有任何Angular特定解决方案或解决方法?
答案 0 :(得分:14)
在angular 2最终版本上,您可以实现自定义ErrorHandler
(Angular 2 docs example):
import {NgModule, ErrorHandler} from '@angular/core';
class MyErrorHandler implements ErrorHandler {
handleError(error) {
// do something with the exception
}
}
@NgModule({
providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
})
class MyModule {}
答案 1 :(得分:9)
<强>更新强>
2.0.0 RC.6将名称从ExceptionHandler
更改为ErrorHandler
,将call
更改为handleError
:
@Injectable()
class MyErrorHandler implements ErrorHandler {
handleError(error) {
// do something with the exception
}
}
@NgModule({
directives: [MyApp],
providers: [
{provide: ErrorHandler, useClass: MyErrorHandler}
]
})
export class AppModule {}
另见this。
<强> ORIGINAL:强>
@Injectable()
class MyExceptionHandler implements ExceptionHandler {
call(error, stackTrace = null, reason = null) {
// do something with the exception
}
}
@NgModule({
directives: [MyApp],
providers: [
{provide: ExceptionHandler, useClass: MyExceptionHandler}
]
})
export class AppModule {}
如果这允许应用程序在异常后继续,我没有尝试过自己,但我认为值得一试。 至少应该可以自动重新加载页面。
通常,当有办法恢复时,应尽可能接近原因处理异常。
答案 2 :(得分:3)
我尝试按 @GünterZöchbauer
的指示实施自定义异常处理程序这对我有用
使用CustomExceptionHandler
启动您的应用程序。
import {ExceptionHandler} from 'angular2/core';
class _ArrayLogger {
res = [];
log(s:any):void {
this.res.push(s);
}
logError(s:any):void {
this.res.push(s);
}
logGroup(s:any):void {
this.res.push(s);
}
logGroupEnd() {
if(this.res.length) {
//this section executes if any error is logged by angular.
//do your stuff here
/*e.g
if(location.pathname !== 'dashboard') {
window.location.href = '/dashboard'; // condition is required to prevent infinite loop
}
*/
}
};
}
export class CustomExceptionHandler extends ExceptionHandler {
constructor() {
super(new _ArrayLogger(), true);
}
call(error, stackTrace = null, reason = null) {
super.call(error, stackTrace, reason);
}
}
bootstrap(MyApp, [provide(ExceptionHandler, {useClass: CustomExceptionHandler})])
答案 3 :(得分:2)
我认为当您使用RxJS Observable时可能会出现此问题,当它们遇到任何错误时会取消订阅。 如果是这种情况,您可能需要:
.subscribe
代替onNext
处理程序在try...catch
的{{1}}处理程序中捕获异常。onError
的{{1}}处理程序中重新订阅。