2017-02-03 7 views
5

In meinem Angular 2 app habe ich einen Entschluß Wache, die eine xhr versucht und einen benutzerdefinierten Fehler auslöst, wenn es fehlschlägt:Wie man einen ZoneAwareError "auspackt"?

return this.service.getProduct (id) 
    .catch (err => Observable.throw(new MyError(err.message, route, 500, err))); 

MyError ist nur eine Erweiterung von Error:

export class MyError extends Error { 

    constructor(message, routeSnapshot, code, err) { 
     super(message); 
     this.name = 'MyError'; 
     this.routeSnapshot = routeSnapshot; 
     this.code = code; 
     this.err = err; 
    } 

} 

Mein globalen Fehler Handler empfängt eine Instanz von ZoneAwareError anstelle von MyError:

export class MyErrorHandler implements ErrorHandler { 

    handleError(error) { 
     console.log('handling err', error); 
     // this prints a ZoneAwareError on the console 
    } 

} 

Soll error wirklich in ZoneAwareError verpackt werden? Wie entpacke ich es, um MyError zurück zu bekommen? Ist es sicher, sich auf die error.rejection Eigenschaft zu verlassen? (Da kann ich MyError dort sehen).

=== Edit:

Ok, ich habe gerade herausgefunden, dass Angular hüllt Fehler in verschiedenen Untertypen von Error, nicht nur ZoneAwareError. Bisher habe ich diese Funktion sie auszupacken, aber es fühlt sich ein bisschen hacky:

function unwrap (err) { 
    let res = err.rejection ? err.rejection : err; 

    while (res.originalError) { 
     res = res.originalError; 
    } 
    res.name = res.name || 'unknown'; 
    return res; 
} 

Antwort