我应该在我的方法中捕获异常以“纯粹记录”目的,从而将错误文档封装在方法本身中,还是调用者的责任?
假设我在我的方法中调用了许多其他方法EncryptPackage()
,包括框架方法,它们可能会引发许多异常。我将所有内容包装在using
块中,因此无需捕获异常进行清理(或者我使用 try/finally 进行清理)。无论如何我应该捕获异常,并提供有关该方法上下文的详细信息,还是调用者方法的责任?
这是案例一:
[Serializable]
class TestClassException : Exception
{
public TestClassException() : base() { }
public TestClassException(string message) : base(message) { }
public TestClassException(string message, Exception innerException) : base(message, innerException) { }
}
class TestClass
{
public TestClass() { }
public void EncryptPackage()
{
try
{
DoSomething();
DoAnotherThing();
}
catch (Exception ex)
{
throw new TestClassException("Error occurred during package encryption", ex);
}
}
}
class ConsumerExample
{
public ConsumerExample() { }
public void DoSomeStuff()
{
TestClass testClass = new TestClass();
try
{
testClass.EncryptPackage();
}
catch (TestClassException ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
}
}
}
在此代码中,请注意该EncryptPackage()
方法如何捕获所有可能的异常,只是为了“装饰错误文本”,并带有“在包加密期间发生错误”文本。EncryptPackage()
这里封装了错误描述逻辑。
这是另一种技术:
class TestClass2
{
public TestClass2() { }
public void EncryptPackage()
{
DoSomething();
DoAnotherThing();
}
}
class ConsumerExample2
{
public ConsumerExample2() { }
public void DoSomeStuff()
{
TestClass testClass = new TestClass();
try
{
testClass.EncryptPackage();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("Error occurred during package encryption.\r\n\r\n" + ex.ToString());
}
}
}
在此示例中,EncryptPackage()
不会捕获任何内容,因为调用方无论如何都会使用“包加密期间发生错误。\r\n\r\n”消息记录错误案例。
请注意,这是一个非常简化的示例,在现实世界中会有许多分层类,并且异常会通过长调用堆栈传播,那么捕获异常的方法是首选?第二种方法似乎“更干净”,因为异常是在将要发生一些“实际处理”(例如向用户显示)的层中处理的。调用堆栈信息将保存在异常对象中,因此从技术上讲,可以找出引发异常的确切位置。但是......这似乎不像第一种方法那样“记录良好”,其中每个抽象级别都将自己的描述添加到错误中,将先前的异常保留在innerException
成员中。在这种情况下,当执行离开TestClass
层,它已经包含在这个类中发生的错误的详细描述。所以这感觉是对错误处理逻辑的更好封装。
使用哪一个?