引发要向用户显示的异常的最佳做法

本文关键字:异常 最佳 显示 用户 | 更新日期: 2023-09-27 18:33:56

简单地

抛出应该终止程序执行的意外异常。它们被CurrentDomain_UnhandledException捕获并在那里处理 - 如有必要,记录,并向用户显示通用的"此应用程序即将崩溃,您对此无能为力"消息。

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

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

引发要向用户显示的异常的最佳做法

可以在

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);
}