例如:
try
{
Task1();
Task2();
Task3();
}
catch (Exception ex)
{
}
现在,如果Task1()中发生异常,则Task2和Task2方法中的代码不会运行。程序停止。
如果发生异常,我怎么能这样做,它下面的代码/方法会一直运行到最后。
由于
答案 0 :(得分:5)
异常将执行移动到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)
{
}
}
答案 1 :(得分:4)
目前,在您拥有的代码中,如果尝试启动 Task1()
时发生异常,则其他两个任务不会启动。如果该任务在没有错误的情况下启动但导致任务处于Faulted
状态,那么您的其他任务就会正确启动。
通常,在大多数情况下,人们不会期望像这样的方法抛出异常启动任务。空检查参数是常见的事情,但除此之外,人们通常希望这些方法不会失败启动任务。如果您对该方法有任何控制权,请考虑重新设计它,以便它生成错误的任务而不是抛出异常,除非您有充分的理由不这样做。
您可能还希望创建一个采用任务返回方法的方法,如果它无法生成任务,则会创建一个错误的任务。如果成功,它可以返回该任务:
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中。
答案 2 :(得分:4)
将每个语句放在自己的try-catch块中:
try
{
Task1();
}
catch (Exception ex)
{
}
try {
Task2();
}
catch (Exception ex)
{
}
try {
Task3();
}
catch (Exception ex)
{
}