为什么(如果有的话)这是个坏主意?
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;
}
}
这里重要的一点是该函数创建了与“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);
}
}
与这个...
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);
}
}
最佳答案
所有异常都有一个数据属性,您可以向其添加其他数据。无需创建新的异常。只需捕获现有异常并添加您的信息,然后重新抛出异常即可。
这样你就可以吃到蛋糕了。 :)
http://msdn.microsoft.com/en-us/library/system.exception_members(v=VS.90).aspx
关于c# - 抛出与捕获的类型相同的 C# 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3863812/