c# - 高效的异常处理技术

标签 c# .net exception performance

我正在用 C# 编写一个应用程序,它要求我根据用户传入的某些维度动态创建一个 Array 对象。Array.CreateInstance() 方法可以抛出(按最后一次计数)我想要处理的 6 个不同的异常。对于每个异常,我想通过一个简单的 MessageBox.Show() 和一条针对异常情况定制的消息来通知用户。我不想做的是捕获一般的 Exception 类型,因为最好不要这样做。我会 try catch ArgumentException 或更具体的东西,但所有异常的唯一公共(public)父类(super class)是 Exception

底线:我正试图找出处理如此多不同异常的最佳方法,以及什么是有效且更重要的是可维护的解决方案。

try
{
    data = Array.CreateInstance(TypeHelper.StringToType(cbDataType.SelectedItem.ToString()), dimensions);
}
catch (OutOfMemoryException) { }
catch (NullReferenceException) { }
catch (NotSupportedException) { }
catch (ArgumentNullException) { }
catch (ArgumentOutOfRangeException) { }
catch (ArgumentException) { }

最佳答案

在该列表中,只有 4 个异常(exception)我会考虑捕获:

  • NotSupportedException
  • ArgumentNullException
  • ArgumentOutOfRangeException
  • ArgumentException

另外两个你永远不应该捕捉到,并且从后来的 CLR 开始,你无法捕捉到 OOM 情况(如果你需要找出来,请考虑 MemoryFailPoint)。

深入研究 Array.CreateInstance,我们明白为什么这四个都会被抛出:

  • NotImplementedException:您给它的类型不能是数组,或者是一个开放泛型。由于您是从固定列表中提取这些数据类型,因此您应该先验知道这些是有效类型。我反对处理此异常。
  • ArgumentNullException:你应该确定你传递的所有参数都不为空,因此这永远不会发生,你不应该处理这个异常。
  • ArgumentOutOfRangeException:其中一个长度小于 0,您可以先验测试,因此您不应处理此异常。
  • ArgumentException:如果类型无效(您已经确定它是有效的)或长度不够,您可以先验.

所以,我建议的代码是:

// code prior to this point ensures cbDataType only has correct types
// and dimensions has at least 1 dimension and is all greater than or equal to 1
data = Array.CreateInstance(
    TypeHelper.StringToType(cbDataType.SelectedItem.ToString()),
    dimensions);

总而言之,我不会处理任何异常,因为您应该能够阻止所有异常的发生,并且您不应该关心无法处理异常的情况。

关于c# - 高效的异常处理技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3197591/

相关文章:

c# - 在 .Net 中实现优先级数组集合的最快(插入速度)方法是什么?

java - 异常处理;试着抓

无法接受 Python 装饰器异常

c# - TCP 客户端/服务器图像传输

.net - 将 .NET 表单设置为 HWND 的父级

c# - 在 POCO 上实现 INotifyPropertyChanged

c++ 异常未被 catch 捕获(异常类型)

c# - 一元运算符(+=、=+、++x 和 x++)之间的区别

c# - 为什么不引发 "Divide by Zero"或任何其他异常?

c# - Icomparer c# 列表