gpt4 book ai didi

c# - 为了 "purely documenting"目的,我应该在我的方法中捕获异常吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:54:52 24 4
gpt4 key购买 nike

为了“纯粹记录”的目的,我应该在我的方法中捕获异常,从而将错误记录封装在方法本身中,还是由调用者负责?

假设我在我的 EncryptPackage() 方法中调用了许多其他方法,包括框架方法,它们可能会引发许多异常。我将所有内容都包装在 using block 中,因此无需捕获异常进行清理(或者我使用 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 层时,它已经包含了发生在这个类中的错误的详细描述。。所以这感觉是对错误处理逻辑的更好封装。

使用哪个?

最佳答案

有一个chapter on this in Effective Java :

Higher layers should catch lower-level exceptions and, in their place, throw exceptions that can be explained in terms of the higher-level abstraction. This idiom is known as exception translation.

关于c# - 为了 "purely documenting"目的,我应该在我的方法中捕获异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12669888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com