我有以下C#代码。每当发现异常时(比如第1行),我就无法到达其他行(2,3,4等)。
try
{
line1
line2
...
}
catch (Exception ex)
{
...
}
在C#中,是否有可能说如果第1行产生异常,只需继续其他行(2,3,4等)?
答案 0 :(得分:16)
不应忽视例外情况。 :)
它们存在并被抛出是有原因的:出现了异常情况,某种情况未得到满足,我无法继续工作......
如果在每行代码周围放置一个try / catch块,可以忽略异常,但我不认为你真的想这样做......
答案 1 :(得分:10)
你可以像这样创建一个SkipOnError方法:
private SkipOnError(Action action)
{
try
{
action();
}
catch
{
}
}
然后你可以这样称呼它:
try
{
SkipOnError(() => /*line1*/);
line2;
line3;
} catch {}
修改:这样可以更轻松地跳过给定的例外:
private SkipOnError(Action action, Type exceptionToSkip)
{
try
{
action();
}
catch (Exception e)
{
if (e.GetType() != exceptionToSkip) throw;
}
}
注意:我实际上并没有建议你这样做 - 至少不是经常这样做,因为我发现自己很讨厌。但它确实展示了我们现在可以在C#中做的一些功能性事情,是的!
我真正要做的是:将line1
重构为方法(提取方法)。该新方法应该处理任何可预见的异常(如果它们可以被处理),从而使调用者处于已知状态。因为有时候你真的想做line1
,除非,如果发生错误就可以了......
答案 2 :(得分:5)
只是试着赶上第1行
try
{
try
{
line1
}
catch (Exception ex)
{
...
}
line2
...
}
catch (Exception ex)
{
...
}
弗雷德里克是对的,虽然这样做时你真的需要小心。它应该根据具体情况使用。只有当您知道该过程应该继续时,才应该使用它。否则你应该相应地处理异常。
答案 3 :(得分:4)
如果有总是希望执行的代码,即使抛出异常,即使异常未在catch块中被捕获,或者catch块重新抛出或抛出新异常,应该进入“最后”块:
try
{
do(something);
}
catch (InvalidArgumentException ex)
{
onlyDealWithOneExceptionType();
}
finally
{
always.runs(no, matter, what);
}
答案 4 :(得分:3)
你可以将每一行隔离成一个try-catch块,但这对我来说只是一些代码。如果您 某些 ,第一行之后的行不会抛出异常,或者无论异常都需要执行并且不会抛出其他错误,您可以添加一个第一次捕获后阻止。例如:
try{
line 1;
}
catch(Exception exc){
//Error handling logic here
}
finally{
line 2;
line 3;
.
.
.
line n;
}
答案 5 :(得分:2)
你可以在try catch块中包装第1行。
答案 6 :(得分:1)
你可以随时
try
{
line1
}
catch (Exception ex)
{
}
line2
...
但是没有像“重试”关键字那样的内容。
答案 7 :(得分:1)
根据建议,您应该在此特定示例中将try catch包装在line1周围。但是,为了将来注意,你应该只在try catch块中有条件,如果没有例外,你只想完成它。
答案 8 :(得分:1)
你可以将其他行放在finally子句中,但这样会非常难看,特别是如果这些行也会抛出异常......
你应该从第一个异常中恢复,然后继续到下一行,将每个异常包装在try / catch语句中。
答案 9 :(得分:1)
正如其他人所说,首先要确保“忽略”异常就是你真正想做的事情。 如果它仍然存在,并且所有try-catch的语法开销太高,你可以使用execute-around idom来包装它。
我现在没有时间草拟所有代码 - 但是你要做的是编写一个方法,该方法接受一个匿名委托并在try-catch中执行它(可能记录任何异常,或者过滤那些异常那是“好的”)。将此方法称为tryDo。然后你可以写这样的代码:
tryDo( delegate(){ line1; } );
tryDo( delegate(){ line2; } );
它仍然有点冗长,但是你不想让这些东西太容易了。这只是足够的开销让你不断想知道这是否正确: - )
答案 10 :(得分:1)
您需要可再生的延续才能做到这一点。 CLR和C#不支持,并且可能永远不会这样做。 :(
答案 11 :(得分:0)
try
{
line1
line2
...
}
catch (Exception ex)
{
...
}
finally
{
if(line1ErrorOccured)
{
line2
...
}
}
没有考虑太多的想法
答案 12 :(得分:0)
如果可以处理您的异常并继续,您应该本地化您的try / catch块。
try
{
line1;
}
catch (ExpectedException e)
{
// Handle your exception, prepare data for the next lines
// Could you have prevented the exception in the first place?
}
try
{
line2;
line3;
}
catch (AnotherExpectedException e)
{
// Maybe this exception you can't continue from. Perhaps log it and throw;
}
请记住异常是例外。如果抛出异常,应该出错。你应该首先尝试防止例外。