为什么与C+中的错误代码相比,异常在C#/.NET编程中如此流行+/Win32?

为什么与C+中的错误代码相比,异常在C#/.NET编程中如此流行+/Win32?,c#,.net,winapi,exception,error-handling,C#,.net,Winapi,Exception,Error Handling,我是一个从C++/Win32开发环境迁移到C#/.NET的人。我注意到的一件事是,在C++/Win32中,大多数错误状态都是通过使用错误代码及其传播来处理的 相反,C#/.NET中的大多数错误状态似乎是通过使用异常来处理的,很少建议使用错误代码 为什么会这样?错误代码的主要问题是需要检查它们。总是 我们是唯一可以忘记的人 这可能意味着,只要忘记检查错误代码,我们的程序就会进入不一致的状态 但是,如果我们忘记处理异常,我们的程序将退出 这被认为比继续在不一致的状态下运行更可取 错误代码在C/C++

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

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


为什么会这样?

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

我们是唯一可以忘记的人

这可能意味着,只要忘记检查错误代码,我们的程序就会进入不一致的状态

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

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

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


使用异常还有其他原因,除了不能忽略这一事实之外——它们携带了大量的上下文,如堆栈跟踪、消息等,超出了异常的类型。

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


例如,一个
FileNotFoundException
比一些模糊的数字更具普遍性,这些数字可能因您运行的平台而异。

查看异常可以提供有关出错原因的更多信息。另外,
try-catch
语句使代码更清晰。您的错误将在运行代码下处理。。而不是通过检查错误代码来污染它。@SimonWhitehead我有点不同意你的评论。您让它听起来像是一个try-catch,意思是在抛出异常之前,您不应该尝试在代码块中处理问题。@HaemEternal,如果某些东西不是异常的话。。您不会使用异常。。因此将在源代码处进行检查。错误代码通常定义得相当清楚。。。如果调用返回错误代码的第三方库,情况会更糟。如果函数返回一个错误代码,并且该函数调用了第三方函数,该函数可以返回重叠的错误代码范围,那么您最终必须将错误代码转换为该函数应该返回的错误代码(否则代码将是不明确的)。你还必须在某个地方维护一个错误代码的主列表,这是假的。如果您可以定义一个在所有平台上都相同的异常类,那么您可以使用错误代码来定义它。@MatthewWatson。。这就是BCL所做的,因为WinAPI返回错误代码。BCL中有大量的switch语句,可以将错误代码转换为异常。@DavidHeffernan这是非常正确的。我同意Marc关于extra的异常提供的观点,尽管像堆栈跟踪和分层异常。我还要补充:extra上下文
InnerException
StackTrace
等-调试时所有这些都是非常宝贵的。