80 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
/**
 | 
						|
 * @license
 | 
						|
 * Copyright Google Inc. All Rights Reserved.
 | 
						|
 *
 | 
						|
 * Use of this source code is governed by an MIT-style license that can be
 | 
						|
 * found in the LICENSE file at https://angular.io/license
 | 
						|
 */
 | 
						|
 | 
						|
import {getDebugContext, getErrorLogger, getOriginalError} from './errors';
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Provides a hook for centralized exception handling.
 | 
						|
 *
 | 
						|
 * The default implementation of `ErrorHandler` prints error messages to the `console`. To
 | 
						|
 * intercept error handling, write a custom exception handler that replaces this default as
 | 
						|
 * appropriate for your app.
 | 
						|
 *
 | 
						|
 * @usageNotes
 | 
						|
 * ### Example
 | 
						|
 *
 | 
						|
 * ```
 | 
						|
 * class MyErrorHandler implements ErrorHandler {
 | 
						|
 *   handleError(error) {
 | 
						|
 *     // do something with the exception
 | 
						|
 *   }
 | 
						|
 * }
 | 
						|
 *
 | 
						|
 * @NgModule({
 | 
						|
 *   providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
 | 
						|
 * })
 | 
						|
 * class MyModule {}
 | 
						|
 * ```
 | 
						|
 *
 | 
						|
 * @publicApi
 | 
						|
 */
 | 
						|
export class ErrorHandler {
 | 
						|
  /**
 | 
						|
   * @internal
 | 
						|
   */
 | 
						|
  _console: Console = console;
 | 
						|
 | 
						|
  handleError(error: any): void {
 | 
						|
    const originalError = this._findOriginalError(error);
 | 
						|
    const context = this._findContext(error);
 | 
						|
    // Note: Browser consoles show the place from where console.error was called.
 | 
						|
    // We can use this to give users additional information about the error.
 | 
						|
    const errorLogger = getErrorLogger(error);
 | 
						|
 | 
						|
    errorLogger(this._console, `ERROR`, error);
 | 
						|
    if (originalError) {
 | 
						|
      errorLogger(this._console, `ORIGINAL ERROR`, originalError);
 | 
						|
    }
 | 
						|
    if (context) {
 | 
						|
      errorLogger(this._console, 'ERROR CONTEXT', context);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /** @internal */
 | 
						|
  _findContext(error: any): any {
 | 
						|
    if (error) {
 | 
						|
      return getDebugContext(error) ? getDebugContext(error) :
 | 
						|
                                      this._findContext(getOriginalError(error));
 | 
						|
    }
 | 
						|
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
 | 
						|
  /** @internal */
 | 
						|
  _findOriginalError(error: Error): any {
 | 
						|
    let e = getOriginalError(error);
 | 
						|
    while (e && getOriginalError(e)) {
 | 
						|
      e = getOriginalError(e);
 | 
						|
    }
 | 
						|
 | 
						|
    return e;
 | 
						|
  }
 | 
						|
}
 |