在 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语句已经执行完毕。和以前一样的待遇! :)