Show error message on Snackbar from GlobalErrorHandler

287 views
Skip to first unread message

Navaneetha Krishnan S

unread,
Mar 15, 2018, 9:36:14 AM3/15/18
to Angular and AngularJS discussion

I have a requirement where I need to show the error messages (if it occurs) in a snackbar using angular material. I have written a GlobalErrorhandler which works fine i.e. gets triggered whenever any errors occurred inside the application.

Inside the GlobalErrorHandler I am trying to log the exception and also I need to display the Error message to the user using Snackbar. But when i add the snackbar reference to the GlobalErrorHandler, I am getting the exception as below

Uncaught Error: Provider parse errors:
Cannot instantiate cyclic dependency! ApplicationRef ("[ERROR ->]"): in NgModule AppModule in ./AppModule@-1:-1
    at NgModuleProviderAnalyzer.webpackJsonp.../../../compiler/@angular/compiler.es5.js.NgModuleProviderAnalyzer.parse (compiler.es5.js:11805)
    at NgModuleCompiler.webpackJsonp.../../../compiler/@angular/compiler.es5.js.NgModuleCompiler.compile (compiler.es5.js:18657)
    at JitCompiler.webpackJsonp.../../../compiler/@angular/compiler.es5.js.JitCompiler._compileModule (compiler.es5.js:26988)
    at compiler.es5.js:26933
    at Object.then (compiler.es5.js:1683)
    at JitCompiler.webpackJsonp.../../../compiler/@angular/compiler.es5.js.JitCompiler._compileModuleAndComponents (compiler.es5.js:26931)
    at JitCompiler.webpackJsonp.../../../compiler/@angular/compiler.es5.js.JitCompiler.compileModuleAsync (compiler.es5.js:26860)
    at PlatformRef_.webpackJsonp.../../../core/@angular/core.es5.js.PlatformRef_._bootstrapModuleWithZone (core.es5.js:4536)
    at PlatformRef_.webpackJsonp.../../../core/@angular/core.es5.js.PlatformRef_.bootstrapModule (core.es5.js:4522)
    at Object.../../../../../src/main.ts (main.ts:11)

I am not understanding what is the cyclic dependency here? why I am not able to instantiate snackbar in the globalerrorhandler?

If it is not a correct approach of showing snackbar in a error handler, then what is the alternate solution for the problem i.e. to display the error message in a snackbar?

Note: any exception occurs inside the application should be displayed in snackbar

my globalerrorhandler code looks like below

import { ErrorHandler, Injectable, Injector } from '@angular/core';
import { LocationStrategy, PathLocationStrategy } from '@angular/common';
import * as StackTrace from 'stacktrace-js';
import { SessionService } from '../Services/SessionService';
import { MdSnackBar } from '@angular/material';

//import { Constants } from './Constants';

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
  constructor(private injector: Injector,
    public snackBar: MdSnackBar,
    private _SessionService: SessionService)
  { }

  handleError(error) {
    debugger;
    const location = this.injector.get(LocationStrategy);
    const message = error.message ? error.message : error.toString();
    const url = location instanceof PathLocationStrategy
      ? location.path() : '';
    // get the stack trace, lets grab the last 10 stacks only
    StackTrace.fromError(error).then(stackframes => {
      debugger;
      const stackString = stackframes
        .splice(0, 20)
        .map(function (sf) {
          return sf.toString();
        }).join('\n');
      // log on the server
      console.log("_SessionService.loggedinuser " + this._SessionService.LoggedInUser);
      console.log("this._SessionService.LAST_API_URL : " + this._SessionService.LAST_API_URL);
      console.log("message : " + message);
      console.log("url : " + url);
      console.log("stack : " + stackString);

      this.snackBar.open("Error Occurred : " + message, "OK", {
        duration: this._SessionService.SnackbarTimer,
      });

    });
    throw error;
  }

}
Reply all
Reply to author
Forward
0 new messages