【问题标题】:Why are exceptions so popular in C#/.NET programming compared to error codes in C++/Win32? [closed]与 C++/Win32 中的错误代码相比,为什么 C#/.NET 编程中的异常如此流行? [关闭]
【发布时间】:2012-12-22 05:59:51
【问题描述】:

我是从 C++/Win32 开发环境迁移到 C#/.NET 的人。我注意到的一件事是,大多数错误状态都是在 C++/Win32 中通过使用错误代码及其传播来处理的。

相反,C#/.NET 中的大多数错误状态似乎都是通过使用异常来处理的,并且很少建议使用错误代码。

为什么会这样?

【问题讨论】:

  • 异常可以提供更多关于哪里出了问题的信息。此外,try-catch 语句使代码更简洁。您的错误在功能代码下方处理..而不是通过检查错误代码来污染它。
  • @SimonWhitehead 我有点不同意你的评论。你让它听起来像一个 try-catch 意味着你不应该在首先抛出异常之前尝试处理代码块中的问题。
  • @HaemEternal 如果没有异常......你不会使用异常......因此会从源头检查它。

标签: c# .net winapi exception error-handling


【解决方案1】:

错误代码的主要问题是需要检查它们。总是。

我们只是人类,可以忘记。

这可能意味着我们可以通过忘记检查错误代码来让我们的程序进入不一致的状态。

如果我们忘记处理异常,我们的程序将退出。

这被认为比继续在不一致的状态下运行更可取。

错误代码在 C/C++ 代码中仍然普遍存在的大部分原因是历史原因 - 这些语言没有异常处理,因此需要错误代码。并且有很多库和代码符合这个习惯用法,所以程序员需要遵守它。

除了不能忽略它们之外,还有其他使用异常的原因 - 它们带有很多上下文,如 Marc observed - 堆栈跟踪、消息等,超出了类型例外。

【讨论】:

  • 我还要补充一点:额外的上下文。 InnerExceptionStackTrace 等 - 在调试时都非常宝贵。
【解决方案2】:

我要说的主要原因之一是错误代码是特定于平台的。 .NET 最初设计为可移植的。

例如,FileNotFoundException 比一些晦涩的数字更通用,后者可能会因您运行的平台而异。

【讨论】:

  • 错误代码通常定义得相当好...pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html
  • 调用第三方库返回错误码的情况会更糟。如果一个函数返回一个错误代码,并且该函数调用可以返回重叠范围的错误代码的第三方函数,您最终必须将错误代码转换为函数应该返回的错误代码(否则代码将是不明确的)。您最终还必须在某处维护错误代码的主列表。
  • 那是假的。如果您可以定义一个在所有平台上都相同的异常类,则可以使用错误代码。
  • @MatthewWatson 有趣.. 这就是 BCL 所做的,因为 WinAPI 返回错误代码。他们在 BCL 中有巨大的 switch 语句,可以将错误代码转换为异常......
  • @DavidHeffernan 确实如此。我同意 Marc 提供的额外异常,例如堆栈跟踪和分层异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多