Angolare 4, personalizzato ErrorHandler non riconosce di Errore personalizzato

Ho provato a creare un custom globale ErrorHandler e seguito le istruzioni dettagliate qui

applicazione di errore del gestore di (solo le parti più importanti)

@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);
        }
    }

app-modulo

 providers: [
    {
        provide: ErrorHandler,
        useClass: ApplicationErrorHandler
    }
],

app.componente (solo la parte importante)

public ngOnInit(): void { 
    const error = new ApplicationError();
    error.message = "fehler";
    throw error;
} 

applicazione di errore

export class ApplicationError implements Error {
    name: string;
    message: string;
    httpStatus?: number = 404;
    applicationStatus?: number;
    errorMessageTranslationkey: string;
    handled: boolean = false;
}

nella mia app.componente butto un ApplicationError (in ngOnInit), il mio ErrorHandler viene chiamato con successo.
Ma il mio errore di handleError è sempre di tipo Error e error.originalError è sempre undefined non importa se mi passi il mio errore personalizzato e c’è il if non potrà mai risolvere al vero.

Non ho idea di come e perché questo accade.
Quello che vedo è che l’errore che si ottiene, quindi, presumo, avvolto, perché quando si esegue il debug vedo error: Error: [object: Object] at viewWrappedDebugError (vendor.bundle.js)

Idea di cosa potrebbe causare questo problema e come posso risolverlo?

MODIFICA
Come il sospetto che abbia qualcosa a che fare con Debugmode. Appena ho abilitare prodmode con enableProdMode(); funziona come previsto.

Ancora questo non risponde alla mia domanda di sicurezza.

Come posso gestire il mio errore personalizzato angolare in modalità di debug?

Si può aggiungere un blocco di codice in cui si stanno gettando l’errore – con throw new ApplicationError()? Nota anche che @NgModule() providers proprietà deve essere un array, come in questo definizione.
Ho aggiunto il codice in cui mi sto buttando l’errore. la cosa con provider è stato un errore di battitura. Ho aggiornato il codice

OriginaleL’autore Arikael | 2017-05-22

One Reply
  1. 16

    Si verifica questo problema, perché ApplicationError non è un Error.

    È possibile utilizzare il codice riportato di seguito per creare un errore personalizzato:

    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);
      }
    }

    Relativi al tema della creazione di un custom di errore, controllare anche questi link per avere un idea sul tema:

    Perché questo deve essere un esempio di Errore?
    Perché il vostro errore di passare attraverso il seguente metodo:

    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;
    }

    Codice disponibile a errori.ts.

    Quindi se non lanciando un Error istanza, quindi viene creata una nuova istanza.

    Intercettare uncatched promesse ErrorHandler

    Un altro caso di errore è quando si torna a una promessa che diventa respinta, dal metodo che viene chiamato dal Angolare del ciclo di vita (ad esempio: gestore del ciclo di vita-hook).

    export class AppComponent implements OnInit {
    
      ngOnInit() {
        return new Promise((resolve, reject) => reject(new ApplicationError()));
      }
    }

    Quindi il codice di gestione degli errori possono apparire come:

    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);
      }
    }
    grazie per questa risposta dettagliata. Ero in grado di risolvere il problema
    ho bisogno di fare la stessa cosa, tranne che ho bisogno di inviare una mail, potete darmi plunker ?
    e viene chiamato due volte e più volte, dovrebbe caricare solo una volta.

    OriginaleL’autore andreim

Lascia un commento