private static DataSet OperateGetDataset(string sTable, string sFiled) { try { string sCommand; OleDbDataAdapter oddaAdapter; DataSet dsData; sCommand = "SELECT " + sFiled + " FROM " + sTable; oddaAdapter = new OleDbDataAdapter(sCommand, odcConnection); dsData = new DataSet(); oddaAdapter.Fill(dsData); return dsData; } catch (Exception ex) { MessageBox.Show("数据加载失败 " + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } }
在主函数调用这个方法之后,假如这个方法执行的是catch语句,则主函数不继续运行。
这样的效果怎么在这个方法中实现?
解决方案
10
子函数没有权利决定父函数的运行过程。
基于你现在想要的效果,个人建议直接删除OperateGetDataset方法的异常处理,让异常直接抛出给主函数即可。
假如主函数想要继续运行,就必须捕获异常。
假如主函数没有捕获异常,那么异常自动往更上层的函数抛,OperateGetDataset自然就不继续运行了。
基于你现在想要的效果,个人建议直接删除OperateGetDataset方法的异常处理,让异常直接抛出给主函数即可。
假如主函数想要继续运行,就必须捕获异常。
假如主函数没有捕获异常,那么异常自动往更上层的函数抛,OperateGetDataset自然就不继续运行了。
10
在一般的任务处理函数中用 try…catch 方式来隐藏异常,是比较低级的做法。
实际上 try….catch 主要是这样用的:
try
{
string sCommand;
OleDbDataAdapter oddaAdapter;
DataSet dsData;
实际上 try….catch 主要是这样用的:
try
{
string sCommand;
OleDbDataAdapter oddaAdapter;
DataSet dsData;
sCommand = “SELECT ” + sFiled + ” FROM ” + sTable;
oddaAdapter = new OleDbDataAdapter(sCommand, odcConnection);
dsData = new DataSet();
oddaAdapter.Fill(dsData);
return dsData;
}
catch (Exception ex)
{
throw new Exception(“数据加载失败,而且本人也不想让你准确调试具体代码。”, ex);
}
注意 Exception 实例化时有第二个参数 InnerException。
这样的 try…catch 的目的只是为了封装一下异常信息,然后继续抛出。而它并不是为了什么“隐藏异常、转而正常返回 null”。那种目的。
一些学过一点 c++ 简单编程知识的业余编程人员,可能学到的入门函数是通过“返回0、返回null、返回错误码等方式来返回异常”的做法。这些在 .net 中都是极其不规范的做法。规范的做法就是 throw 异常,而且不要胡乱写 catch。异常就是要抛给整个系统的底层表现层最外层(专门处理界面的最外层代码),而不走 return 代码。