留住异常的堆栈信息【throw ex 和 throw 的区别】
当我们想把框架底层的异常向上抛时(比如从DAL到BLL),例如下面的代码
所以上面的代码应该使用throw关键字来向上抛出异常。
try
{
//提交数据库
}
catch (System.Data.SqlClient.SqlException ex)
{
throw ex;
}
finally
{
//释放资源
}
上面代码的的问题在于,会造成CLR重新设置异常抛出的起点,导致我们在查看异常堆栈的时候,无法知道实际抛出异常的最底层的调用。{
//提交数据库
}
catch (System.Data.SqlClient.SqlException ex)
{
throw ex;
}
finally
{
//释放资源
}
所以上面的代码应该使用throw关键字来向上抛出异常。