引发要向用户显示的异常的最佳做法
本文关键字:异常 最佳 显示 用户 | 更新日期: 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);
}