gpt4 book ai didi

c# - 如何用两种方法构造代码,一个接一个,抛出相同的两个异常?

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:10 25 4
gpt4 key购买 nike

我有两种方法,一个接一个地调用,它们都抛出完全相同的 2 个异常(如果发生错误情况,并不是说我得到了异常)。

为此,我是否应该在每个 try block 中使用一个语句编写单独的 try 和 catch block 并捕获两个异常(这两个异常我都可以处理,因为我检查了 MSDN 类库引用并且我可以做一些事情,例如,重新打开 SqlConnection 或运行查询而不是不存在的存储过程)。所以像这样的代码:

try
{
obj.Open();
}

catch (SqlException)
{
// Take action here.
}


catch (InvalidOperationException)
{
// Take action here.
}

对于我之后直接调用的另一种方法也是如此。这似乎是一种非常困惑的编码方式。另一种方法是使用异常变量进行编码(因为我使用 AOP 来记录异常详细信息,使用类级属性,所以被省略了)。这样做可以帮助我找出导致异常的方法,然后采取相应的措施。这是最好的方法还是有另一种最佳做法?

我还假设,因为只抛出了这两个方法,所以我不需要捕获异常,因为那是我无法处理的异常(导致我无法控制)。

谢谢

最佳答案

你不应该捕获异常,除非你能以合理的方式处理它并从错误中恢复。考虑到这一点,您应该选择不捕获这些异常,或者您应该捕获它们并做一些有用的事情然后继续。

假设您正在尝试执行后者:处理错误并继续,那么无论两个语句中的哪一个失败,都做同样的事情真的有意义吗?假设你有这个:

try {
f1();
f2();
} catch (FooException) {
// Recover from error and continue
}

f3();

在这种情况下,如果 f1() 失败并且您从错误中恢复,则永远不会执行 f2() - 它会直接转到 f3() 。那真的是你想要的吗?也许有时是……但通常不是。

更有可能的是,在 f1() 出现错误后,您要么想要完全退出错误,要么恢复然后继续执行 f2()。如果是这样,那么您将需要两个单独的 try/catch block 。

如果您对恢复不感兴趣而只是记录异常,那么最简单的方法是让它们传播并在更高级别捕获它们(但在您的程序崩溃或变得不可用之前)并记录消息和堆栈跟踪。这确保您将记录所有异常并避免在每个可能抛出的方法中插入 try/catch 和日志代码。

关于c# - 如何用两种方法构造代码,一个接一个,抛出相同的两个异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2526934/

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