gpt4 book ai didi

c# - 错误处理的设计模式

转载 作者:行者123 更新时间:2023-11-30 19:05:29 26 4
gpt4 key购买 nike

我在各种项目中遇到过几次这个问题,我想知道是否有比我通常最终使用的解决方案更好的解决方案。

假设我们有一系列需要执行的方法,我们想知道其中一个方法是否出现问题并优雅地退出(可能撤消任何先前的更改......),我通常会这样做以下(伪 C# 因为这是我最熟悉的):

private bool SomeMethod()
{
bool success = true;
string errorMessage = null;
success = TestPartA(ref errorMessage);
if (success)
{
success = TestPartB(ref errorMessage);
}
if (success)
{
success = TestPartC(ref errorMessage);
}
if (success)
{
success = TestPartD(ref errorMessage);
}
//... some further tests: display the error message somehow, then:
return success;
}

private bool TestPartA(ref string errorMessage)
{
// Do some testing...
if (somethingBadHappens)
{
errorMessage = "The error that happens";
return false;
}
return true;
}

我只是想知道(这是我的问题)是否有更好的方法来处理这种事情。我似乎最终写了很多 if 语句来做一些看起来应该更流畅的事情。

有人建议我对一组委托(delegate)函数进行循环,但我担心这会过度设计解决方案,除非有一种干净的方法来做到这一点。

最佳答案

我认为您应该使用异常。请注意,您通常应该只在应用程序的“顶层”捕获异常。

private void TopLevelMethod()
{
try
{
SomeMethod();
}
catch (Exception ex)
{
// Log/report exception/display to user etc.
}
}

private void SomeMethod()
{
TestPartA();
TestPartB();
TestPartC();
TestPartD();
}

private void TestPartA()
{
// Do some testing...
try
{
if (somethingBadHappens)
{
throw new Exception("The error that happens");
}
}
catch (Exception)
{
// Cleanup here. If no cleanup is possible,
// do not catch the exception here, i.e.,
// try...catch would not be necessary in this method.

// Re-throw the original exception.
throw;
}
}

private void TestPartB()
{
// No need for try...catch because we can't do any cleanup for this method.
if (somethingBadHappens)
{
throw new Exception("The error that happens");
}
}

我在示例中使用了内置的 System.Exception 类;您可以创建自己的派生异常类,或使用从 System.Exception 派生的内置异常类。

关于c# - 错误处理的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21476716/

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