【问题标题】:Generate code for all exceptions thrown by a method为方法抛出的所有异常生成代码
【发布时间】:2013-10-18 14:31:59
【问题描述】:

您知道是否有任何选项或扩展可以生成代码以捕获 Visual Studio 中的方法引发的所有异常?

例如我打电话给File.WriteAllBytes(...)

该方法可以抛出 9 个异常:System.ArgumentException、System.ArgumentNullException 等。

我想要所有 9 个异常的代码:

catch (ArgumentException) {

}
catch (ArgumentNullException) {

}
...

我在 Eclipse for Java 中看到过这种行为,但我想知道 Visual Studio 中是否有类似的东西。

顺便说一句,我正在使用 Visual Studio 2012 Premium

【问题讨论】:

  • 您不应该捕获 ArgumentException 或 ArgumentNullException,因为它们是 "boneheaded exceptions"。您应该编写代码,以免它们被抛出。
  • 您需要单独处理所有这些吗?如果没有,catch (Exception).
  • 您必须拥有非常成熟的用户,他们将知道如何处理ArgumentNullExceptionArgumentException。正如 Thomas 暗示的那样,这些应该更早被捕获并给出有意义的反馈。
  • 我认为他并不担心是否应该捕获所有异常。看来他只是想知道VS2012中是否有自动生成try{} catch{}块的快捷方式,似乎已经回答了here

标签: c# .net visual-studio visual-studio-2012 exception-handling


【解决方案1】:

在 Visual Studio 中没有这样的东西。

主要问题是,与 Java 不同,C# 不支持 throws 子句之类的东西。因此,没有办法直接知道方法会引发哪些可能的异常。该工具是围绕 C# 中不存在的语言特性构建的。

Anders Hejlsberg discusses this decision in detail in this interview.

话虽如此,在 C# 中,您通常不希望显式捕获所有这些异常。您应该只捕获可以正确处理的异常。如果您想捕获所有异常以进行日志记录,只需在任何特定异常类型后使用单个 catch (Exception e),它就会捕获所有其他异常。

【讨论】:

  • 感谢 Reed 的回答 我阅读了采访,现在我明白了为什么我从未见过类似的东西。我想我需要手动编写我想要处理的所有异常。
  • 如果您想使用catch(Exception e) 同时捕获它们,只是添加到@ReedCopsey 的答案中,但对其中一些异常做一些有意义的事情,您可以在一个中使用is 运算符if 语句即if(e is PathTooLongException)
【解决方案2】:

C# 不是 Java。您不仅需要捕获方法抛出的所有异常,这也是一个非常糟糕的主意。

您应该只捕获您需要处理的异常。如果对于特定的异常没有什么特别需要做的,那么让它冒泡给你的调用者,它可能有一些需要做的事情。也可能不会。

【讨论】:

  • 我知道 C# 不是 Java,但是如果我想根据抛出的异常向用户提供不同的反馈呢?我知道无论发生什么我都可以捕获(异常前)并提供默认消息,或者获取 ex.Message 并将其显示给用户,但有时这些消息对用户不太友好。
  • 您的用户几乎可以肯定不需要知道这个级别的详细信息。问问自己,如果你告诉他有一个ArgumentException,你的用户会做什么!事实上,只有程序员才能真正对那个异常做点什么。对于您向用户报告的每一个异常,问问自己用户应该如何处理它。
  • 正如我之前在评论中提到的,这些只是几个样本,我想我为这个问题选择了错误的样本。在我的问题中,我谈论的是代码生成,而不是需要捕获哪些异常。正如我所提到的那样,诸如 PathTooLongException 之类的异常呢?或 DirectoryNotFoundException?或未授权访问异常?用户需要对这些异常做些什么。
  • 来自这些异常的正常消息可能没问题。微软可能已经考虑过与PathTooLongException 打交道的用户。该异常的正常 Message 属性有什么问题?
  • 它们没什么问题,只是有时它们对用户不太友好,对于其中一些用户,我喜欢就如何解决问题向用户提供一些具体的反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2015-11-15
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
相关资源
最近更新 更多