异常处理
本文关键字:异常处理 | 更新日期: 2023-09-27 18:08:31
当处理异常时,例如在我的表示逻辑中的方法中,如果这里的唯一目的是提醒用户,那么可以像下面这样在一个catch块中捕获所有可能的异常吗?
void Do()
{
try
{
// ...
}
catch (Exception e)
{
MessageBox.Show(e.message);
}
}
或者我们应该在单独的catch块中捕获所有可能的异常(如OutOfMemoryException
, NullReferenceException
等,后面跟着更通用的异常)吗?
由于e.message
中的信息与普通用户无关,我们可以这样做:
MessageBox.Show("Exception occurred and contact system administrator");
这是标准的方式吗?那么管理员如何跟踪错误(因为没有显示堆栈跟踪)?
注意:我的唯一目的是提醒用户并尽量保持系统正常运行(不崩溃)
这是一个非常糟糕的做法。如果你需要捕获异常,那么就捕获专门的异常,然后对它做出反应。你基本上只捕获你可以处理的异常,而不是所有可能发生的异常。良好的代码设计还可以帮助防止向您抛出异常。例如,您可以使用Null对象模式来省略或显著降低抛出NullReferenceException
的风险。Try/Do模式在避免NullReference异常方面也做得很好。
请阅读MSDN -异常处理。
显示给用户的错误信息也应该更具体,提供一些细节,但不要太技术化(例如,代替"MemoryWriteException occurred",你应该显示"磁盘空间不足")。请放开……"在代码中处理的异常不需要传播给用户。这破坏了应用程序流程和整体体验,因为用户对此无能为力。考虑使用一个可以被开发人员访问的日志记录器。
请参阅MSDN -错误消息指南。
最好在代码中使用通用异常。这是最常用的用法。没有标准,只有最佳实践。使用特定异常的一种规则可以是:
- 管理资源(文件、连接、第三方组件等)
- 当业务规则被破坏时抛出自己的异常(为此创建自己的异常类)
- 你认为可以抛出其他类型异常的进程(线程、异步、调用服务等)。
- 添加异常类型,以改进代码和管理流程。
一般来说,代码越复杂,必须使用的try catch和exception类型就越多。无论如何,Exceptions不是一个UI工具,而是一个开发资源。