【问题标题】:Can I remove empty catch with throw?我可以用 throw 去掉空的 catch 吗?
【发布时间】:2011-06-29 08:26:57
【问题描述】:

我希望这很简单。我在一个大型代码库上工作,整体质量很好,但偶尔你会得到一些:

try
{
   // Calls a .NET remoting method.
}
catch
{
   throw;
}

请注意,没有 finally 逻辑,并且 catch 没有指定任何异常或执行我上面提供的以外的任何操作。但是,我知道捕获和重新抛出可以改变异常详细信息中的调用堆栈。我不确定的是,这种行为是否是专门因为 .NET 远程调用而出现的。

删除这个 try-catch 是否安全?据我所知,确实如此,但我想我会先仔细检查是否有任何奇怪的行为。

【问题讨论】:

  • @Dan 好奇你为什么认为需要更改问题?
  • 虽然更改标题是一件微妙的事情,但当我认为它更易于搜索时,我倾向于编辑它们。 google.com/?q=can+i+remove+empty+catch+with+throw 现在将您的问题作为最佳答案,我相信这是人们输入的查询比您的原始标题更有可能。
  • 还不错,怀疑是为了搜索。

标签: c# .net exception-handling .net-remoting


【解决方案1】:

重新抛出你已经展示过不应该改变调用堆栈,除非远程异常有什么特别之处。 (我知道有一些特殊方面,但我不认为它们在这里发挥作用。)这是一种确实丢失信息的事情:

catch(Exception e)
{
    throw e; // Not throw;
}

我的猜测是一些开发人员将其包含在内只是为了在throw 行上放置一个断点。我会摆脱它。

【讨论】:

  • 仅使用throw 仍然可以改变堆栈跟踪 如果异常被抛出与throw 语句相同的堆栈帧 - 在这种情况下,行号是重置为throw 语句的行(而不是最初引发异常的行)
  • 它已经被删除了,我现在只需要一个不显眼的缺陷号来检查它:-)
【解决方案2】:

据我所知,catch (Exception ex) { throw ex } 重置了堆栈跟踪。只是catch { throw; } 没有。

因此,如果您不对错误执行任何其他逻辑,例如记录,我不知道有什么理由不删除那个捕获。

【讨论】:

    【解决方案3】:

    在某些与代码访问安全相关的情况下,catch-rethrow 子句可能是必要的安全功能。但我怀疑它是否适用于此。特别是因为没有任何理智的人会在不添加评论的情况下使用这种模式。

    这样做的目的是防止异常过滤器在增加权限时运行。

    一些相关文章:

    http://blogs.msdn.com/b/shawnfa/archive/2005/03/31/404320.aspx
    http://msdn.microsoft.com/en-us/library/8cd7yaws(v=VS.100).aspx
    http://www.pluralsight-training.net/community/blogs/keith/archive/2005/03/31/7149.aspx


    自 .net 2 以来似乎已过时:
    Impersonation and Exception Filters in v2.0

    【讨论】:

    • 对我们来说不是这样,因为我们不使用 CAS。但是,有趣的信息,谢谢。
    【解决方案4】:

    虽然在大多数情况下,它可能是冗余/不必要的代码, try { .. } catch { throw; } 可以抑制编译器优化和 JIT 方法内联。这主要出现在调用堆栈跟踪中。

    因此,“可能”存在一个依赖于其他地方的副作用。

    可以说,“错误”将依赖于这个实现细节,尤其是没有关于这种预期行为的明确文档。尤其是因为这不是保证。

    参见Release IS NOT Debug: 64bit Optimizations and C# Method Inlining in Release Build Call Stacks,它甚至早于这个老问题。

    虽然代码看起来多余,但 try-catch 代码 won't be eliminated during compilation 也是。

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      相关资源
      最近更新 更多