指引网

当前位置: 主页 > 编程开发 > C >

asp.net Throw new exception详细应用说明

来源:网络 作者:佚名 点击: 时间:2017-07-19 23:04
[摘要] 

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();
}
}
}

------分隔线----------------------------