我正在用 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/