【问题标题】:What's the Best Way to handle file and image loading exceptions?处理文件和图像加载异常的最佳方法是什么?
【发布时间】:2012-04-04 17:19:07
【问题描述】:
除了没有解决方案或替代方案(例如无法打开图像)之外,我通常会执行以下操作:
try
{
img.load_from_file("my_image.png");
}
catch( const image_loading_exception& e )
{
/* Could Not Load Image: 'my_image.png' ! */
string err = "Could Not Load Image: " + e.what() + " !"; //
pro::message_box::show( err );
}
现在,这真的是很好的错误处理吗?我应该做一些更具描述性的事情,还是尝试解决问题。在处理图像或文件加载失败时,我唯一能想到的就是显示错误消息框。你们是做什么的?
【问题讨论】:
标签:
c++
exception
file-io
exception-handling
error-handling
【解决方案1】:
这取决于要求:
- 如果程序由于缺少关键图像而无法继续运行,则应停止执行并通知用户发生了什么
- 如果用户输入了错误的参数(例如,错误的文件名),应通知用户并要求重新输入
- 如果它根本不重要,那么只需记录一条消息而不通知用户
【解决方案2】:
你应该做什么很大程度上取决于上下文。
如果这样的代码被放置在一个处理程序中,比如文件|打开菜单选项,您正在打开图像文件,那么它似乎是可以接受的。
另一方面,如果它被放置在应用程序的某些皮肤内部深处,那么这很可能是不好的。首先,您不知道何时执行此操作以及消息框是否合适。您不知道这将多久执行一次(如果这是 100 个图像之一,那么显示 100 个消息框是不好的......)。在致命的情况下,如果以某种方式显示消息框(或被用户关闭)会导致再次执行此代码,这可能会导致死循环。
因此,除非您提供上下文,否则很难提供合理且有用的答案。
还要注意,除非您知道load_from_file 的详细信息或其对image_loading_exception 内容的保证,否则向用户显示what() 不是一个好主意。该字符串很可能是(或可能)对用户无用且无法理解的技术信息。 (另一方面,如果这只是您或其他程序员的工具应用程序,那么它可能是可以接受的 - 再次上下文!)
此外,除非您知道 image_loading_exception 会在其 what() 中执行此操作,否则您可以考虑捕获典型案例(丢失文件、拒绝访问、空文件、损坏的文件......)并显示专用(“面向用户”)消息可能会将what() 作为默认隐藏的详细信息或将其记录在某处。