java提供了很好的异常处理机制,但是如何用好异常并不容易,需要根据开发对象的不同采用的异常机制,本文主要在eclipse rcp开发的时候总结的一个异常的处理机制,个人认为适合于图形界面开发,总结起来,归纳如下:
(1)合理使用checked exception和unchecked exception,说明使用这两种异常的原则的文章很多,不多罗嗦了
(2)异常的转换,如果需要,可以将底层的异常包装为包含更多含义的自定义异常重新抛出(包括checked和unchecked的自定义异常体系),自定义异常不仅仅需要包含原始的异常信息,还要包含一些特定的含义和处理方法;
(3) 异常的抛出,尽量不要在中间层处理异常,要么在异常发生的地方处理,要么抛出,推迟到由最终调用层来处理,比如由与用户直接打交道的UI层,捕捉异常,并以错误信息框、对话框等信息载体反馈良好的信息给用户
这也只是我个人的一些观点,希望大家能给出更好的方式
范例:
(1)定义自定义的异常:包括了两个构造函数,一个用于提供默认的异常信息,一个供程序员添加更加详细的异常信息,这个异常,可以用来封装所有的底层异常,但是一般在逻辑上更加清楚,可以增加不同的自定义异常,比如数据库处理异常、文件处理异常、网络处理异常等
public
class
DataException
extends
RuntimeException {
public DataException(String str, Throwable cause) {
super (str, cause);
}
public DataException(Throwable e) {
super ( " 数据操作出错错误 " , e);
}
}
public DataException(String str, Throwable cause) {
super (str, cause);
}
public DataException(Throwable e) {
super ( " 数据操作出错错误 " , e);
}
}
(2)使用自定义的异常封装底层异常:
public
static
boolean
exportToExcel(String desLocation,String templateName, List list, String beanName) hrows DataException {
boolean ok = false ;
Map beans = new HashMap();
beans.put(beanName, list);
XLSTransformer transformer = new XLSTransformer();
try {
transformer.transformXLS(templateName, beans, desLocation);
ok = true ;
} catch (ParsePropertyException e) {
throw new DataException( " 导出excel出错,解析excel文件出错 " ,e);
} catch (IOException e) {
throw new DataException( " 导出excel出错,文件操作出错 " ,e);
}
return ok;
}
boolean ok = false ;
Map beans = new HashMap();
beans.put(beanName, list);
XLSTransformer transformer = new XLSTransformer();
try {
transformer.transformXLS(templateName, beans, desLocation);
ok = true ;
} catch (ParsePropertyException e) {
throw new DataException( " 导出excel出错,解析excel文件出错 " ,e);
} catch (IOException e) {
throw new DataException( " 导出excel出错,文件操作出错 " ,e);
}
return ok;
}
(3)在用户界面部分的处理,通过MessageDialog反馈给用户正确的信息:
try
{
String templateName = BundlePathUtil.getRealPath(Activator.PLUGIN_ID, " excelTplts\\ " );
templateName = templateName + " aaa.xls " ;
// 从tableviewer中获取数据
List list = (List) personTableViewer.getInput();
ExcelUtil.exportToExcel(desLocation, templateName, list, " aaa " );
} catch (DataException e) {
// 这里我用了e.getMessage(),但是再更实际的环境中,应该给最终用户看到的是一个友好的、高层的出错信息,详细的 出错信息// 应该在日志文件中体现
MessageDialog.openError(window.getShell(), " 导出失败 " , " 失败原因: " + e.getMessage());
// 退出
return ;
}
// 增加导出完成的提示,比如信息框
MessageDialog.openInformation(window.getShell(), " 导出成功 " , " 查询结果已导入到 " + desLocation);
String templateName = BundlePathUtil.getRealPath(Activator.PLUGIN_ID, " excelTplts\\ " );
templateName = templateName + " aaa.xls " ;
// 从tableviewer中获取数据
List list = (List) personTableViewer.getInput();
ExcelUtil.exportToExcel(desLocation, templateName, list, " aaa " );
} catch (DataException e) {
// 这里我用了e.getMessage(),但是再更实际的环境中,应该给最终用户看到的是一个友好的、高层的出错信息,详细的 出错信息// 应该在日志文件中体现
MessageDialog.openError(window.getShell(), " 导出失败 " , " 失败原因: " + e.getMessage());
// 退出
return ;
}
// 增加导出完成的提示,比如信息框
MessageDialog.openInformation(window.getShell(), " 导出成功 " , " 查询结果已导入到 " + desLocation);
总结
参考资料
Best Practices for Exception Handling
http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html