throw new exception
曾经看过有人在简单的函数内疯狂的使用throw new 参与业务逻辑。比如,以下代码:
catch(exception ex)
{
string error = ex.message;
}
public object dosomething(string username)
{
try
{
if (string.isnullorempty(username))
{
throw new exception("用户名不能为空");
}
}
catch (exception ex)
{
return ex.message;
}
return true;
}
捕获异常以后,再抛出一个新的异常。再抛出新异常之前,你可以对前面捕获的异常做一些操作,比如记录日志、获取异常信息然后写到新异常中
int num = convert.toint32(textbox1.text);
try
{
if (num == 0)
{
throw new argumentnullexception("出现0!");
}
if (num == 1)
{
throw new exception("出现一!");
}
}
catch (argumentnullexception ex)
{
messagebox.show(ex.message);
}
catch (exception ex)
{
messagebox.show(ex.message);
}
catch是用来处理错误,就是发生了错误时,会执行catch部分.注意:是"发生了错误时".
但是, 在没有发生错误时, 你自己想引发错误怎么办呢? 可以使用throw语句来手工引发一个错误.
抛出不该抛出的exception
上文中的dosomething函数如果在catch时不进一步封装,直接把excepiton抛到ui层,又或者直接显示给客户。如果异常堆栈中提示某些敏感数据。比如sql查询语句、webservice uri或post信息等。这些敏感信息应该永远不让客户知道,暴露出这些信息有可能对系统造成潜在安全隐患!
三、更好的利用exception
在实际的开发中,既然抛出了exception那么我们应该为exception提供尽可能多的关于异常本身的有用信息。如何为抛出的异常提供更多的有用信息呢?请看以下代码:
public static void executecommand(action<idbcommand> action, ref string errmsg)
{
using (var connection = new sqlconnection("数据库教程连接字符串"))
{
var cmd = connection.createcommand();
try
{
action(cmd);
cmd.executenonquery();
}
catch (dbexception ex) //注意这里将dbexception catch住
{
errmsg = ex.message;
var parameters = new dictionary<string, object>();
foreach (sqlparameter p in cmd.parameters)
parameters.add(p.parametername, p.value);
//尽可能获取与exception相关的有用信息,这里只是用sqlparameter举例而已。
//todo:(将 parameters 与 ex 对象保存或者进一步处理)
}
catch (exception ex)
{
//todo 其他的异常处理
}
finally
{
cmd.dispose();
}
}
}
|