抛出要向用户显示的异常的最佳实践

时间:2014-12-11 17:19:48

标签: c# .net winforms

简单地抛出应该终止程序执行的意外异常。他们被CurrentDomain_UnhandledException抓住并在那里照顾 - 必要时记录,并且通用"这个应用程序即将崩溃,你无需做任何事情"消息显示给用户。

但是那些只需要取消操作的异常,同时向用户显示更有用的消息呢?例如通知用户无法访问文件,因为该文件正由另一个进程使用。这个异常可能是深层嵌套的,我不想在每个方法返回时检查一些标志。我宁愿有这样的事情:当用户发起最多"外部"方法 - 比如按钮单击事件处理程序,代码将包含一个try-catch块,捕获所有DisplayToUserException,并重新抛出任何其他异常。所以我必须创建这个自定义异常类。

但是在我走这条路之前,我想知道这是否是标准的事情,或者可能有更好的解决方案。或者也许已经为此建立了一个类。因此这个问题。

1 个答案:

答案 0 :(得分:1)

可以在UI事件周围放置一个try / catch块:

public void Button1_Click(object sender, EventArgs e)
{
    try {
        // Do something interesting, like calling methods that throw (nested) exceptions
        // Maybe these methods do file I/O
    }
    // Though it's better to catch a more-specific exception or set of exceptions
    catch (IOException ex){ 
        MessageBox.Show(ex.ToString());
    }
}

这限制了异常对UI操作的影响(在这种情况下,按钮单击)。

一个真正未处理的异常,你无法预料或做任何事情,仍将由AppDomain异常处理程序处理。

另请注意,异常Message属性意味着向用户显示。可以捕获“技术”异常,并通过用户友好的消息重新抛出异常。但请务必包含原始例外:

try {
    // Do something with the file name in the <c>path</c> variable
}
catch(IOException ex){
    throw new InvalidOperationException(
        String.Format("Can't perform that file I/O on {0}, sorry about that", path), ex);
}