如何避免捕获一般异常

时间:2014-05-14 15:57:58

标签: c# exception-handling

我正在处理用户在循环中提交的表单,以防表单提交失败(由于许多原因可能导致失败:错误的数据,无法识别的字符,数据库错误和其他未知数),我想记录这个错误以及用户和表单详细信息,然后继续下一个用户/表单。

我目前正在使用包含泛型catch的try catch块,但我从许多人那里听说捕获泛型异常是一件坏事(因为异常可能是stackoverflowexception或outofmemoryexception)。但我不确定如何避免捕获这些致命的例外情况。我正在寻找建议。

我正在编辑此问题,以根据回复添加更多上下文..

为什么我要捕获所有异常:  因为我不希望在一种形式的处理中失败以影响循环中的其他形式。

为什么我要捕捉特定的例外情况:  我理解我可以查找stackoverflowexception,outofmemoryexception等...但我的观点是,可能有很多...寻找每一个都会使我的代码冗长。我不确定这是否是最好的过程。

5 个答案:

答案 0 :(得分:5)

  

但我不确定如何避免捕获这些致命的例外

嗯,2件事。

首先,您可以随时重新抛出它们,例如,在记录之后。

其次,你可以捕获你想要的每个异常,如果你没有捕获System.Exception,那么所有你没有捕获的东西会冒出来 - 对于初学者来说就是C#101,所以如果你有问题,那么回到阅读关于一般例外的文件。

答案 1 :(得分:4)

例外级联下来。如果要以不同方式处理某些异常,请实现不同的catch块。

try
{
    ThisMethodMayThrowException();
}
catch(StackOverflowException ex)
{
    //handle a StackOverFlowException
}
catch(OutOfMemoryException ex)
{
    //handle a OutOfMemoryException 
}
catch(Exception ex)
{
    //handle all other types.
}

一般而言,您应该只计划处理预期的异常。例如,如果您要写入预期存在的文件,则可能会预期FileNotFoundException。如果你试图处理所有可能的异常,那么你的代码就会变得很长而且难以处理,几乎没有什么好处。

Microsoft提供有关exception handling的优秀信息。

答案 2 :(得分:0)

  

我目前正在使用包含通用catch的try catch块,   但是我从许多人那里听说,捕捉一般异常就是一个   坏事(因为异常可能是stackoverflowexception或   OutOfMemoryException异常)。

您应该知道您的方法称为 可能 投掷的Exception种类型。

可以在Method文档中找到它,例如:

 /// <exception cref="DivideByZeroException">Why it's thrown.</exception>
 public void MethodThatMightThrowDivideByZeroException(){...}

或查看方法代码,例如:

throw new DivideByZeroException();

这样,您就可以轻松捕捉到它:

try
{
    ThisMethodMayThrowException();
}
catch(DivideByZeroException ex)
{
    //handle a DivideByZeroException 
}

答案 3 :(得分:0)

如果你知道要捕获的所有异常,你可以为每个特别编写一个catch块:

try
{
}
catch (IOException)
{
}
catch (InvalidCastException)
{
}
...

然后,所有你想要捕捉的东西(从而允许可能会删除你的程序)将继续冒泡。

答案 4 :(得分:0)

建议catching generic exception被误解了。处理明确知道的所有异常,但总是有一个通用捕获所有异常处理程序,以至少报告并正确处理未知。