C#存在异常ID

时间:2012-10-25 08:11:39

标签: c# try-catch

我的软件使用Try Catch来捕获错误;最近发生了一个错误(与数据库的超时连接),并弹出一个Messagebox.Show()警告用户该问题。这个内部软件的最终用户根本不具备IT知识。收到这条消息的那位女士问我与谁失去联系(老实说她认为这是一种精神上的“联系”,因为她看起来像个嬉皮士)。

所以我想做的是简化错误消息。

我考虑过的事情:

我可以检查/比较ex.Message字符串到我想要满足的字符串列表,如果匹配,我会显示简化版本。 IMO,不现实。

然后我想有多个捕获,如果它是某种类型,则显示简单消息。但是我的代码会变得多么混乱!不仅如此,它也可能最终会产生误导性消息,因为并非所有(例如)TimeOutExceptions都是相同的。

或者,我必须尝试编写自己的异常类型以满足此需求。

然后,如果每个.NET异常都有一个关联的ID,那将非常方便 - 这样,我可以用每个ID和我自己的好的,易于准备/理解的消息编写一个很好的case语句。

之前有没有其他人考虑过这个问题,他们是否找到了合适的安排。或者最好只是在屏幕上显示一条消息“错误 - 电子邮件已发送给软件供应商......”)?

4 个答案:

答案 0 :(得分:3)

您永远不应该向最终用户显示Exception.message。这是有助于识别错误类型的信息文本。

任何时候你捕获异常,你应该正确处理它或重新抛出/抛出另一个异常。如果您处于通过显示某些错误消息来处理异常的代码点,您应该能够从异常本身正确地推断出上下文。您可以使用适当的异常类型来创建一些基本的异常域(DatabaseException,CommunicationException),并使用错误代码在其域中进一步区分异常。

您可以使用属于Exception类的Data属性,它是IDictionary的类型,因此可用作Exception状态包。然后你可以在这里存储类似'ERR_CODE'= CONSTANT的东西,并有一些单点异常处理来检查错误代码,如果它存在,用一些用户友好的输出来处理异常。

您甚至可以在当前AppDomain中注册全局异常处理程序以捕获任何未捕获的异常并显示一些消息。这是常见的做法,但是您必须意识到这种方法会破坏自然的代码流,如果发生这种情况,您将留下处理异常但未捕获的异常流(您没有在调用者站点上处理异常)然后不知道呼叫失败并且可能表现得不可预测)。因此,只能通过打印一些用户友好的消息并结束应用程序或终止当前的Usecase来使用此方法。

答案 1 :(得分:2)

如果永远您编写的代码如catch (Exception ex)那么您做错了。您应始终捕获特殊情况的编码情况的特定异常。

阅读Eric Lippert的"Vexing exceptions" blog entry

捕获异常并仅显示消息是在“愚蠢”的异常类别中。你永远不应该拥有它们。

相反,你应该只有埃里克所阐述的其他三种类型的例外。您应该捕获所涉及的特定异常类型,而不是通用的Exception类型。

如果您发现特定的例外,那么您可以向最终用户提供非常合理的信息 - 甚至提供有关如何解决问题的信息。

更好的是,没有所有通用异常捕获代码将更容易调试,更清洁,更简洁。代码中错误的主要预测因素是您编写的实际代码行。编写更少的代码并减少错误。

所以我的建议是更改代码设计并适当处理异常。

答案 2 :(得分:2)

通常,您需要按类型处理异常(例如catch (SomeSpecificException)

某些派生的异常类型确实有其他代码,例如

e.g。 SqlException具有Number属性,可用于控制流/信息

catch (System.Data.SqlClient.SqlException sqlEx)
{
  if (sqlEx.Number == 1205) // Deadlock
     ...
  if (sqlEx.Number == -2) // = TimeOut
     ...
  // etc.
}

修改

实际上,System.Exception 确实拥有受保护的HRESULT property。见How do I determine the HResult for a System.IO.IOException?How to get Exception Error Code in C#

虽然无法直接访问,但您可以通过Marshal.GetHRForException(ex)检索它。不同的例外有不同的HRESULT,例如

System.Exception :  HRESULT COR_E_EXCEPTION (0x80131500)
System.SystemException : HRESULT COR_E_SYSTEM (0x80131501)

也就是说,根据其他答案,捕获特定的异常仍然是IMO的首选机制 - 可能是HRESULT机制是COM宿醉。

答案 3 :(得分:0)

您应该处理并提供有意义的消息,只有您预计代码中可能出现这些异常,并且可以处理异常。您没有预料到的任何异常,显示通用消息并将消息记录到日志文件或事件日志中。您可能还需要为未处理/意外的异常设置策略,以便显示与联系支持和退出应用程序联系的消息。