异常处理

本文关键字:异常处理 | 更新日期: 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 -错误消息指南。

最好在代码中使用通用异常。这是最常用的用法。没有标准,只有最佳实践。使用特定异常的一种规则可以是:

    管理资源(文件、连接、第三方组件等)
  1. 当业务规则被破坏时抛出自己的异常(为此创建自己的异常类)
  2. 你认为可以抛出其他类型异常的进程(线程、异步、调用服务等)。
  3. 添加异常类型,以改进代码和管理流程。

一般来说,代码越复杂,必须使用的try catch和exception类型就越多。无论如何,Exceptions不是一个UI工具,而是一个开发资源。