如何避免捕获泛型异常
本文关键字:泛型 异常 何避免 | 更新日期: 2023-09-27 18:03:34
在我的处理中,我想记录任何错误以及用户和代码细节,并继续我的工作。
我目前正在使用一个try catch块,其中包括一个泛型捕获,但是捕获一个泛型异常是一件坏事吗?例如,异常可能是stackoverflowexception或outofmemoryexception,需要以不同的方式处理…
但是我不确定如何避免捕获这些致命的异常。我在寻求建议。
为什么我要捕获所有异常
因为我不希望一个表单处理的失败影响到循环中的其他表单。
为什么我捕获特定的异常:
我知道我可以寻找stackoverflowexception, outofmemoryexception等…但我的观点是,可能有很多人……寻找每一个都将使我的代码冗长。我不确定这是不是最好的方法。
但是我不确定如何避免捕获这些致命的异常
好吧,有两件事。
首先,您总是可以重新抛出它们,例如,在记录之后。
第二,你可以捕获任何你想要的异常,如果你不捕获System。然后所有你没有捕捉到的异常都会出现——这是初学者的c# 101,所以如果你对此有问题,请回到阅读关于异常的一般文档。
异常级联。如果你想以不同的方式处理某些异常,实现不同的catch块。
try
{
ThisMethodMayThrowException();
}
catch(StackOverflowException ex)
{
//handle a StackOverFlowException
}
catch(OutOfMemoryException ex)
{
//handle a OutOfMemoryException
}
catch(Exception ex)
{
//handle all other types.
}
一般来说,你应该只计划处理预期的异常。例如,如果您正在写入一个您期望存在的文件,那么您可能期望有一个FileNotFoundException
。如果你试图处理每一个可能的异常,你的代码将变得相当长和笨拙,几乎没有什么好处。
Microsoft提供了关于异常处理的优秀信息。
改变你的想法…因为建议catching generic exception
被误解了。
处理显式已知的所有异常(做日志并继续处理),但是总是有一个通用的catch all异常处理程序来停止所有的处理并处理未知的异常
在您的示例中,溢出异常可能包含数据或让恶意行为者以意想不到的方式接管系统;因此继续,不应该这样做。
如果您知道要捕获的所有异常,则可以专门为每个异常编写捕获块:
try
{
}
catch (IOException)
{
}
catch (InvalidCastException)
{
}
...
然后,所有您不想捕获的(因此可能会使您的程序崩溃)将继续冒泡。
我目前正在使用一个try catch块,其中包括一个泛型catch,但是我听很多人说,捕捉泛型异常是一件很困难的事情糟糕的事情(因为异常可能是stackoverflowexception或outofmemoryexception)。
你应该知道你的方法调用了哪些Exception
类型可能会抛出
可以在方法文档中找到,例如:
/// <exception cref="DivideByZeroException">Why it's thrown.</exception>
public void MethodThatMightThrowDivideByZeroException(){...}
或者通过查看方法代码,例如:
throw new DivideByZeroException();
这样,您就可以很容易地捕获它:
try
{
ThisMethodMayThrowException();
}
catch(DivideByZeroException ex)
{
//handle a DivideByZeroException
}