【问题标题】:How to tell whitch exceptions a .NET call throws?如何判断 .NET 调用引发了哪些异常?
【发布时间】:2012-03-16 23:18:44
【问题描述】:

如果有以下代码:

data.SaveChanges();

(数据是ObjectContext

MSDN doc 已将OptimisticConcurrencyException 列为已抛出。这很好,但我知道UpdateException 也可以被抛出(可能还有其他人)。我如何知道一个方法可以抛出哪些异常?

我不想捕获Exception,因为我只想捕获我知道我可以以某种方式处理的异常。 一般来说,这不仅仅是上面的例子。必须有某种方法可以知道“内置”.NET 方法正在抛出哪个异常。

【问题讨论】:

  • 一些不错的阅读 stackoverflow.com/a/264755/555547 ;]
  • MSDN 库列出了您可能想要捕获的异常。可能会引发另一个异常,您不想想要捕获它们,因为它们总是意味着发生了一些您无法从中恢复的非常糟糕的事情。与 UpdateException 一样,您无法从损坏的数据库中恢复。
  • Hans:感谢您对 MSDN 文档的解释 - 澄清了一些事情。

标签: c# .net exception-handling try-catch


【解决方案1】:

这不是“原生”方法;这是一个普通的方法,碰巧是微软写的,而不是你写的。
实际的本机方法不能抛出托管异常(尽管 COM 互操作会将事物转换为托管异常)

与 Java 不同,C# 没有异常规范,因此没有固有的方法可以知道方法会抛出什么异常。

您唯一的选择是文档或反编译器。

【讨论】:

  • 你说得对,我不知道该怎么称呼它。但我想这只是一种普通的方法。内置到 .NET 框架中。我知道 C# 没有检查异常,例如 Java - 我只是认为(希望)有某种方法可以知道要处理的异常。
  • 好吧,文档不可靠,我不会反编译整个 .NET 框架。猜猜我只需要编写无错误的代码:) 无论如何,谢谢你的回答。
  • @NicklasJepsen 为什么您如此关心尝试处理异常?标准做法是不处理它们并让它们在调用堆栈上浮动。
  • 我并不想处理每一个异常——我只是想知道哪个异常会实际发生。在 MCPD Exam Ref 70-518 一书中指出,最佳实践不仅是让异常在堆栈上浮动,而且要尽可能接近导致它的代码来处理它们。
  • @NicklasJepsen:您应该在相关代码附近处理 relevant 异常(您可以做一些事情)。这些例外情况通常是显而易见的并记录在案。
【解决方案2】:

以防万一(对不起,如果很明显,但有些人不知道),您可以将鼠标悬停在 VS 编辑器视图中的类名/方法调用上。如果在文档中定义,它会向您显示该方法可能引发的所有异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2011-05-03
    • 1970-01-01
    • 2020-04-20
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多