【发布时间】:2021-10-31 06:31:45
【问题描述】:
我正在使用以下代码,但我不确定正确的方法是什么。
try
{
// Do code for Try1
Console.WriteLine("Try1 Successful");
}
try
{
// If try1 didn't work. Do code for Try2
Console.WriteLine("Try2 Successful");
}
try
{
// If try2 didn't work. Do code for Try3
Console.WriteLine("Try3 Successful");
}
catch (Exception)
{
// If try1, 2 and 3 didn't work. print this:
Console.WriteLine("The program failed");
}
我想要的是尝试 3 种不同的任务方式,如果其中 3 种失败,则打印“程序失败”,但如果其中一种成功,则不要执行其他方法并继续程序
编辑:
我正在尝试执行的任务是寻找网络路径。
任务 1 将查看路径是否可以打开,如果可以打开目录。
如果不能:任务 2 将查看是否可以打开第二条路径,如果可以打开目录。
如果没有:任务 3 将查看第三条路径是否有效,如果有效,请打开它。
如果不是“在这台电脑上找不到路径”
【问题讨论】:
-
听起来你希望在第一次捕获中进行第二次尝试,然后在第二次捕获中进行第三次尝试,最后一次捕获将打印失败。像这样
try { firstThing; } catch { try { secondThing;} catch{ try { thirdThing; } catch { printFailure; } } } -
如果您在设计时知道您的 try1、try2、try3 等代码可能会失败,您应该尝试以向调用者表明它们没有失败的方式编写它们工作。返回一个布尔值以指示成功或失败,或者实现您自己的特定异常类型,从您的 try1 等代码中抛出该异常类型,并仅捕获该异常类型。
catch(Exception)将捕获(几乎)所有异常类型,并且只应在有限的情况下使用,主要是在应用程序的顶层记录问题所在,而不是让应用程序完全崩溃 -
如果您可以编辑您的问题以包含您的 try1、try2 等代码正在执行的操作的 minimum reproducible example,我们可以帮助您改进错误处理。
-
这看起来是一个非常糟糕的设计。我不记得曾经编写或阅读过这样的代码。如果您完全控制被调用的代码,请以不抛出异常的方式设计它。如果您无法访问源代码,请在执行关键代码之前检查前置条件。在你的情况下使用例如Directory.Exists 或 File.Exists 以检查目录/文件是否存在。您渲染的场景可以简单地避免任何异常。异常非常昂贵,并且会大大降低您的应用程序的速度。
-
@sbridewell 由于缺乏信息,我已经投票决定关闭答案。回答这么宽泛的问题是不可能的。你必须知道实际的代码。从来没有一个单一的解决方案对所有情况都是最好的。最佳解决方案可能因情况而异。