当前位置: 首页 > 知识库问答 >
问题:

尝试捕获并重新抛出异常

宇文迪
2023-03-14

前几天,我在我们的一个项目中看到一些代码,它们使用try-catch并重新抛出捕获的异常,如下所示:

try
{
    exceptionProneCode();
}
catch(Exception ex)
{
    throw ex;
}

除了catch块中的异常之外,没有做任何其他操作,所以我甚至不确定它为什么会被抛出。我看不出再次抛出同一个异常并对该异常不做任何处理有什么好处。

如果重新抛出catch块中捕获的异常,C#如何处理?它是否陷入了无限抛接球循环?还是说它最终会放弃试一试?

共有3个答案

慕容成和
2023-03-14

它将异常抛出给调用者。但它在这里处理它,这样它就不会抛出未处理的异常。但是,老实说,我看不出这有什么好处。让它抛出异常。为什么?因为只有当它上面的整个调用堆栈没有try... catch时,异常才会未处理。这没有做任何有用的事情。

仲法
2023-03-14

它继续在调用堆栈中抛出异常。这段代码所做的一件事与您没有捕获异常不同,它会将异常位置(调用堆栈、第#行等)重置为您重新抛出异常的位置,因此您将没有抛出原始异常的位置。

如果您不打算在catch块中实际执行某些操作,我建议您不要捕获,或者至少使用而不是扔ex重新抛出。

景理
2023-03-14

考虑这两种模型:

1-通过重新投掷ex

catch(Exception ex)
{
    throw ex;
}

你松开了StackTrace。如果在某个地方记录了异常,则包含调用堆栈立即帧(方法调用历史)的堆栈跟踪将丢失。

2-相比之下,抛出

catch(Exception ex)
{
    // do something here
    throw;
}

您可以维护StackTrace。您可以进行额外的处理,然后重新抛出异常,而不会丢失跟踪字符串。

 类似资料:
  • 问题 你在一个 except 块中捕获了一个异常,现在想重新抛出它。 解决方案 简单的使用一个单独的 rasie 语句即可,例如: >>> def example(): ... try: ... int('N/A') ... except ValueError: ... print("Didn't work") ...

  • 我有这样的情况,即活动调用管理器类调用提供者。 活动->管理器(带有asyncTask的方法)->提供程序 我应该如何将捕获的异常发送回活动?

  • 我有以下情况: 所有代码都在@Transactional内部(传播=传播。REQUIRES_NEW)。基本上,我想调用< code>doSomething,如果它抛出一个异常,设置实体的一个字段,提交,然后再抛出异常。但是,它不起作用,因为事务被标记为回滚。

  • "CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误

  • 嘿StackOverflow社区, 关于抛出异常。一般什么时候抛出和异常,什么时候抓取? 假设我遇到了这样的情况,我不得不退出,因为发生了一些问题,我无法从它中恢复过来。我是投还是接? 我现在就这么做: 这样做对吗?如果我只是抛出异常会更合适吗?对不起,我是例外的新手:)

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。