我正在处理用户在循环中提交的表单,以防表单提交失败(由于许多原因可能导致失败:错误的数据,无法识别的字符,数据库错误和其他未知数),我想记录这个错误以及用户和表单详细信息,然后继续下一个用户/表单。
我目前正在使用包含泛型catch的try catch块,但我从许多人那里听说捕获泛型异常是一件坏事(因为异常可能是stackoverflowexception或outofmemoryexception)。但我不确定如何避免捕获这些致命的例外情况。我正在寻找建议。
我正在编辑此问题,以根据回复添加更多上下文..
为什么我要捕获所有异常: 因为我不希望在一种形式的处理中失败以影响循环中的其他形式。
为什么我要捕捉特定的例外情况: 我理解我可以查找stackoverflowexception,outofmemoryexception等...但我的观点是,可能有很多...寻找每一个都会使我的代码冗长。我不确定这是否是最好的过程。
答案 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
被误解了。处理明确知道的所有异常,但总是有一个通用捕获所有异常处理程序,以至少报告并正确处理未知。