2017-02-03 17 views
5

Trong 2 ứng dụng kiễu góc của tôi, tôi có một người bảo vệ quyết tâm mà cố gắng một XHR và ném một lỗi tùy chỉnh nếu nó không thành công:Làm thế nào để "unwrap" một ZoneAwareError?

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

MyError chỉ là một phần mở rộng của 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; 
    } 

} 

lỗi toàn cầu của tôi người xử lý nhận được một phiên bản của ZoneAwareError thay vì MyError:

export class MyErrorHandler implements ErrorHandler { 

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

} 

error có thực sự được gói trong ZoneAwareError không? Làm thế nào để tôi tháo nó ra để lấy lại MyError? Có an toàn để dựa vào tài sản error.rejection không? (Bởi vì tôi có thể thấy MyError ở đó).

=== Edit:

Ok, tôi chỉ phát hiện ra rằng góc kết thúc tốt đẹp sai sót trong tiểu loại khác nhau của Error, không chỉ ZoneAwareError. Cho đến nay tôi có chức năng này để unwrap họ, nhưng nó cảm thấy một chút hacky:

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

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

Trả lời

4

Bạn có thể xem như thế nào unwrapping được thực hiện trong góc riêng của mình: angular/modules/@angular/core/src/error_handler.ts, tuy nhiên họ không có vẻ để xử lý rejection (đó là khá hữu ích) theo bất kỳ cách nào để tôi sử dụng các mục sau đây trước khi unwrapping:

if(error.hasOwnProperty('rejection')) 
    { 
     error = error.rejection; 
    } 

UncaughtPromiseError giao diện trong zone.js.

Các vấn đề liên quan