在 try catch 块中调用 subscribe on observable
calling subscribe on observable inside try catch block
有人可以向我解释为什么这没有被 catch 块捕获,我想是因为我有一个 switch 映射,它会取消订阅第一个 observable。没有运气就把它注释掉了。第一个可观察到的 (this.apiPaymentService.deleteStoredPaymentMethod()) 是导致 403
的那个
try {
this.apiPaymentService.deleteStoredPaymentMethod()
.pipe(
switchMap(() => this.apiPaymentService.getStoredAchPaymentMethods(),
catchError((err) => { return throwError(err)})
).subscribe()
} catch (error) {
console.log('I am never called ')
this.errorModal(error);
}
首先:确保您的代码解析
如果我将其放入 IDE,我会立即收到解析错误。我假设您不希望将运算符作为 switchMap 的第二个参数,并且您只是忘记了行尾附近的 )
。
您的 try 块中发生了什么?
在您的 try 块中,您订阅了一个可观察对象。而已。那就是那里发生的事情。订阅没有错误发生。因此,您的 try-catch 将无误地完成。
如果 this.apiPaymentService.getStoredAchPaymentMethods()
是异步的,try 块将在 getStoredAchPaymentMethods()
解析为一个值之前完成(甚至可能不再在调用堆栈中)。
如何管理异步错误
您已经完成大部分内容了!您可以在此处管理它,而不是捕获然后重新抛出错误。
以下是no-op:
catchError((err) => { return throwError(err)})
但是你可以 return 换个东西,或者你可以重试或类似的东西:)
旁白:不仅仅是可观察的
这里有一些 old-skool 代码具有相同的基本现象。
function throwErrorFunction() {
console.log("Throwing an error!");
throw 'Throwing an error from my throw error function';
}
try {
setTimeout(throwErrorFunction, 5000);
} catch (error) {
console.log('I am never called ');
}
这里有一个思考这个问题的方法。上面的代码从不调用 throwErrorFunction
。 JavaScript 中的函数应用是用括号完成的。因此,您需要在某处使用 throwErrorFunction()
之类的内容才能调用该函数。但这在这里永远不会发生。
但控制台仍会以某种方式显示“抛出错误!”。那么如果我们没有调用 throwErrorFunction
会怎样呢?好吧... setTimeout
最终为我们打电话给 throwErrorFunction
!在这种情况下,它会等待 5 秒,然后调用该函数。
但五秒后,try-catch语句已经执行完毕。和以前一样的待遇! :)
有人可以向我解释为什么这没有被 catch 块捕获,我想是因为我有一个 switch 映射,它会取消订阅第一个 observable。没有运气就把它注释掉了。第一个可观察到的 (this.apiPaymentService.deleteStoredPaymentMethod()) 是导致 403
的那个try {
this.apiPaymentService.deleteStoredPaymentMethod()
.pipe(
switchMap(() => this.apiPaymentService.getStoredAchPaymentMethods(),
catchError((err) => { return throwError(err)})
).subscribe()
} catch (error) {
console.log('I am never called ')
this.errorModal(error);
}
首先:确保您的代码解析
如果我将其放入 IDE,我会立即收到解析错误。我假设您不希望将运算符作为 switchMap 的第二个参数,并且您只是忘记了行尾附近的 )
。
您的 try 块中发生了什么?
在您的 try 块中,您订阅了一个可观察对象。而已。那就是那里发生的事情。订阅没有错误发生。因此,您的 try-catch 将无误地完成。
如果 this.apiPaymentService.getStoredAchPaymentMethods()
是异步的,try 块将在 getStoredAchPaymentMethods()
解析为一个值之前完成(甚至可能不再在调用堆栈中)。
如何管理异步错误
您已经完成大部分内容了!您可以在此处管理它,而不是捕获然后重新抛出错误。
以下是no-op:
catchError((err) => { return throwError(err)})
但是你可以 return 换个东西,或者你可以重试或类似的东西:)
旁白:不仅仅是可观察的
这里有一些 old-skool 代码具有相同的基本现象。
function throwErrorFunction() {
console.log("Throwing an error!");
throw 'Throwing an error from my throw error function';
}
try {
setTimeout(throwErrorFunction, 5000);
} catch (error) {
console.log('I am never called ');
}
这里有一个思考这个问题的方法。上面的代码从不调用 throwErrorFunction
。 JavaScript 中的函数应用是用括号完成的。因此,您需要在某处使用 throwErrorFunction()
之类的内容才能调用该函数。但这在这里永远不会发生。
但控制台仍会以某种方式显示“抛出错误!”。那么如果我们没有调用 throwErrorFunction
会怎样呢?好吧... setTimeout
最终为我们打电话给 throwErrorFunction
!在这种情况下,它会等待 5 秒,然后调用该函数。
但五秒后,try-catch语句已经执行完毕。和以前一样的待遇! :)