异常处理

CAD*_*CAD 0 .net c# exception-handling

例如,在我的表示逻辑中的方法中处理异常时,如果此处的唯一目的是警告用户,是否可以在一个catch块中捕获所有可能的异常,如下所示.

void Do()
{
    try
    {
        // ...
    }    
    catch (Exception e)
    {
        MessageBox.Show(e.message);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者我们是否应该总是在单独的catch块中捕获每个可能的异常(例如OutOfMemoryException,NullReferenceException等等,然后是更广泛的异常)?

由于信息e.message与普通用户无关,我们可以这样做:

MessageBox.Show("Exception occurred and contact system administrator");
Run Code Online (Sandbox Code Playgroud)

这是标准方式吗?那么管理员如何跟踪错误(因为堆栈跟踪没有显示)?

注意:我的唯一目的是提醒用户并尝试保持系统正常运行(不会崩溃).

Bio*_*ode 6

这是一个非常糟糕的做法.如果您需要捕获异常,则捕获专门的异常,然后对其作出反应.您基本上只捕获可以处理的异常而不是所有可能发生的异常.良好的代码设计也可以帮助防止异常被抛到你身上.例如,您可以使用Null对象模式来省略或显着降低NullReferenceException抛出的风险.Try/Do模式也可以很好地避免NullReference异常.

请阅读MSDN - 异常处理.

显示给用户的错误消息也应该更具体,并提供一些细节,但不要过于技术性(例如,而不是"发生MemoryWriteException",你会显示'磁盘空间不足.请释放......'.一个例外是在代码中处理不需要传播给用户.这会破坏应用程序流和整体体验,因为用户无需对此进行任何操作.请考虑使用可由开发人员访问的记录器.

请参阅MSDN - 错误消息指导.