我的软件使用Try Catch来捕获错误;最近发生了一个错误(与数据库的超时连接),并弹出一个Messagebox.Show()警告用户该问题。这个内部软件的最终用户根本不具备IT知识。收到这条消息的那位女士问我与谁失去联系(老实说她认为这是一种精神上的“联系”,因为她看起来像个嬉皮士)。
所以我想做的是简化错误消息。
我考虑过的事情:
我可以检查/比较ex.Message字符串到我想要满足的字符串列表,如果匹配,我会显示简化版本。 IMO,不现实。
然后我想有多个捕获,如果它是某种类型,则显示简单消息。但是我的代码会变得多么混乱!不仅如此,它也可能最终会产生误导性消息,因为并非所有(例如)TimeOutExceptions都是相同的。
或者,我必须尝试编写自己的异常类型以满足此需求。
然后,如果每个.NET异常都有一个关联的ID,那将非常方便 - 这样,我可以用每个ID和我自己的好的,易于准备/理解的消息编写一个很好的case语句。
之前有没有其他人考虑过这个问题,他们是否找到了合适的安排。或者最好只是在屏幕上显示一条消息“错误 - 电子邮件已发送给软件供应商......”)?
答案 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)
您应该处理并提供有意义的消息,只有您预计代码中可能出现这些异常,并且可以处理异常。您没有预料到的任何异常,显示通用消息并将消息记录到日志文件或事件日志中。您可能还需要为未处理/意外的异常设置策略,以便显示与联系支持和退出应用程序联系的消息。