出现异常后,继续运行

本文关键字:继续 运行 异常 | 更新日期: 2023-09-27 18:02:17

例如:

 try
{
   Task1();
   Task2();
   Task3();
}
catch (Exception ex)
{
}

现在如果在Task1()中发生异常,Task2和Task2方法中的代码不会运行。程序停止。

我怎样才能使异常发生时,它下面的代码/方法将继续运行到最后

谢谢

出现异常后,继续运行

异常将执行移到try块的末尾并进入catch块。要做你想做的,你必须使用单独的try/catch块:

try
{
   Task1();
}
catch (Exception ex)
{
}
try
{
   Task2();
}
catch (Exception ex)
{
}
try
{
   Task3();
}
catch (Exception ex)
{
}

可以把你的任务放在一个集合中(假设它们都有相同的签名)并循环,但最终效果是一样的:

var tasks = new Action[] {Task1, Task2, Task3};
foreach(var task in tasks)
{
    try
    {
       task();
    }
    catch (Exception ex)
    {
    }
}

目前,在你所拥有的代码中,如果有一个异常抛出试图启动 Task1(),那么其他两个任务没有启动。如果该任务没有错误地启动,但是导致一个任务处于Faulted状态,则您的其他任务已正确启动。

一般来说,在大多数情况下,人们不会期望这样的方法抛出异常开始任务。Null检查参数是通常做的事情,但除此之外,人们通常希望这些方法在启动任务时不会失败。如果您对该方法有任何控制权,请考虑重新设计它,以便它生成一个有错误的任务,而不是抛出异常,除非您有很好的理由不这样做。

您可能还想创建一个接受任务返回方法的方法,如果它不能生成任务,则创建一个有故障的任务。如果成功,它可以返回该任务:

public static Task WrapExceptions(this Func<Task> function)
{
    try
    {
        return function();
    }
    catch (Exception e)
    {
        var tcs = new TaskCompletionSource<bool>();
        tcs.SetException(e);
        return tcs.Task;
    }
}

如果您想确保即使在启动任务时出现异常也能启动所有任务,那么您需要将每个方法调用包装在自己的try/catch中。

将每条语句放到自己的try-catch块中:

try
{
   Task1();
}
catch (Exception ex)
{
}
try {
   Task2();
}
catch (Exception ex)
{
}
try {
   Task3();
}
catch (Exception ex)
{
}