Bla*_*ght 7 c# exception-handling
为什么(如果有的话)这是一个坏主意?
class Program
{
static void Main(string[] args)
{
try
{
throw new NotImplementedException("Oh dear");
}
catch (Exception ex)
{
throw NewException("Whoops", ex);
}
}
// This function is the salient bit here
public static Exception NewException(String message, Exception innerException)
{
return Activator.CreateInstance(innerException.GetType(), message, innerException) as Exception;
}
}
Run Code Online (Sandbox Code Playgroud)
这里重要的一点是该函数创建了与"innerException"相同类型的异常.
我在想......"哦......发生了异常.我实际上无法在这里处理它,但我可以添加一些额外的信息,并重新抛出.也许是另一个处理程序,更高的调用链可以处理它."
一个恰当的例子可能是某种SQL错误.我可能无法在调用时处理异常,但可能希望添加一些额外的"上下文"信息,例如"我正在调用它,并传递它".
似乎将调用链作为最初引发的类型的异常传递回来可能是有用的,而不是"Exception"或"ApplicationException".我知道我可以创建自己的自定义异常类,但是当你已经有一个很好的特定异常时,它似乎没有增加任何东西.
当然,我可能错了.这可能是一件非常有用的事情......但是一个小小的声音暗示着没有.
-----编辑-----
为了辩论,请考虑以下两个函数的效果(使用上面的代码):
这......经常看到:
static int SalesTotal(int customerNumber)
{
try
{
throw new DivideByZeroException(); // something you didn't expect
}
catch (Exception ex)
{
throw new ApplicationException("Unable to calculate sales for customer " + customerNumber, ex);
}
}
Run Code Online (Sandbox Code Playgroud)
与此相比......
static int SalesTotal(int customerNumber)
{
try
{
throw new DivideByZeroException(); // something you didn't expect
}
catch (Exception ex)
{
throw NewException("Unable to calculate sales for customer " + customerNumber, ex);
}
}
Run Code Online (Sandbox Code Playgroud)
Kha*_*meh 12
所有异常都有一个Data属性,您可以添加其他数据.无需创建新的异常.只需捕获现有异常并添加您的信息,然后重新抛出异常即可.
这样你就得到你的蛋糕并吃掉它.:)
http://msdn.microsoft.com/en-us/library/system.exception_members(v=VS.90).aspx
对于这样的通用方法来说,创建新的异常类型不是一个好的选择,因为现有代码将无法对特定错误做出反应。(不过,API 边界处的翻译异常是有用的)。
创建相同类型的新异常似乎很危险。CreateInstance您使用的重载是否将所有字段从 复制innerException到新的外部异常?如果堆栈上方的异常处理程序依赖于解析Message属性怎么办?如果异常构造函数有副作用怎么办?
恕我直言,你真正在做的是记录,你可能会更好地实际进行记录和重新抛出。
| 归档时间: |
|
| 查看次数: |
1895 次 |
| 最近记录: |