我可以避免C#中的异常,继续执行代码吗?

ase*_*sel 7 c# exception-handling visual-studio-2008 visual-studio c#-3.0

我有以下C#代码.每当发现异常时(例如在第1行),我就永远无法到达其他行(2,3,4等).

try
{
    line1
    line2
    ...
}
catch (Exception ex)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

在C#中,是否可以说如果第1行产生异常,只需继续其他行(2,3,4等)?

Fre*_*els 16

不应忽视例外情况.:)
它们存在并被抛出是有原因的:出现了异常情况,某种情况未得到满足,我无法继续工作......

如果在每行代码周围放置一个try/catch块,可以忽略异常,但我不认为你真的想这样做......

  • @jmein:你觉得你的顾客只有一半的订单会很开心吗?或者他们会,如果碰巧发生的事情是小计算. (3认同)

Dar*_*mas 10

你可以像这样创建一个SkipOnError方法:

private SkipOnError(Action action)
{
    try 
    {
        action();
    }
    catch
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用它:

try
{ 
    SkipOnError(() => /*line1*/);
    line2;
    line3;
} catch {}
Run Code Online (Sandbox Code Playgroud)

编辑:这应该可以更容易地跳过给定的异常:

private SkipOnError(Action action, Type exceptionToSkip)
{
    try 
    {
        action();
    }
    catch (Exception e)
    {
        if (e.GetType() != exceptionToSkip) throw;            
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我实际上并没有建议你这样做 - 至少不是经常这样做,因为我发现自己很讨厌.但它确实展示了我们现在可以用C#做​​的一些功能性事情,但是!

我真正要做的是:重构line1一个方法(Extract Method).该新方法应该处理任何可预见的异常(如果它们可以被处理),从而使调用者处于已知状态.因为有时你真的想做line1,除非,如果发生错误,也许没关系......


Jos*_*ein 5

只是试着赶上line1

try
{
    try
    {
        line1
    }
    catch (Exception ex)
    {
       ...
    }

    line2
    ...
}
catch (Exception ex)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

弗雷德里克是对的,虽然这样做时你真的需要小心.它应该根据具体情况使用.只有当您知道该过程应该继续时,才应该使用它.否则你应该相应地处理异常.

  • 从长远来看,这会产生比解决更多的麻烦. (6认同)
  • 我同意它并不总是最好的解决方案,但有时你需要继续.例如,当您创建订单时,订单创建过程中存在错误.在有可能破坏的块周围添加try catch是一个好主意.这样您仍然可以获得订单的所有信息,而您的客户也不必完全重新创建订单. (2认同)