Dart:throw和rethrow有什么区别?

11

也许这很显而易见,但我仍然无法理解 throwrethrow 之间的区别以及何时应该使用它们?

2个回答

24
根据Effective Dart:
如果决定重新抛出异常,请优先使用rethrow语句,而不是使用throw抛出相同的异常对象。 rethrow保留了异常的原始堆栈跟踪。 另一方面,throw会将堆栈跟踪重置为最后一个抛出的位置。
最大的区别在于保留原始堆栈跟踪。
他们提供了两个例子来展示预期的使用方式:

不好的例子:

try {
  somethingRisky();
} catch (e) {
  if (!canHandle(e)) throw e;
  handle(e);
}

好的:

try {
  somethingRisky();
} catch (e) {
  if (!canHandle(e)) rethrow;
  handle(e);
}

这正是我在谷歌搜索时找到的,但仍然不理解。当我看了 ResoCoder 关于处理异常的视频后,变得更加困惑了。 - user13848261
@TersterWordp 你不明白什么? - Christopher Moore
如果我使用throw e而不是rethrow,堆栈跟踪会发生什么变化? 您能否提供一个个人示例,说明何时使用它们中的任何一个? - user13848261
1
@TersterWordp 这个问题展示了一个原始堆栈跟踪丢失的例子,而答案则展示了如何使用rethrow来保留它。只需尝试类似这样的操作并查看堆栈跟踪的差异即可明显看出。 - Christopher Moore

1

虽然回应有点晚,但我想这对现在或将来的某个人会有所帮助。 抛出和重新抛出用于处理异常。

throw关键字用于在代码中遇到异常并启动引发异常的过程。更像是在发出异常的信号。

rethrow关键字用于在堆栈中向上传播异常。更像是捕获异常并执行一些处理,然后传播到更高级别的处理程序。

总结

throw

  • 用于创建和发出异常。

rethrow

  • 用于在低级别点捕获并处理异常,然后将相同的异常传播到更高级别的处理程序。
  • 适用于在多个级别处理异常,并仍保留原始异常,对于调试和故障排除非常有价值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接