如何避免捕获泛型异常

本文关键字:泛型 异常 何避免 | 更新日期: 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 
}