Sco*_* M. 3 .net c# performance exception-handling
我正在用C#编写一个应用程序,它要求我Array从用户传入的某些维度动态创建一个对象.该Array.CreateInstance()方法可以抛出(通过最后计数)我想要处理的6个不同的异常.对于每个例外情况,我都希望通过一个简单MessageBox.Show()的消息来告知用户,并根据特殊情况定制消息.我不想做的是抓住一般Exception类型,因为不这样做是最好的做法.我会尝试捕获ArgumentException或更具体的东西,但所有异常的唯一常见超类是Exception.
结论:我正在试图找出处理这么多不同异常的最佳方法,以及什么是有效的,更重要的是可维护的解决方案.
try
{
data = Array.CreateInstance(TypeHelper.StringToType(cbDataType.SelectedItem.ToString()), dimensions);
}
catch (OutOfMemoryException) { }
catch (NullReferenceException) { }
catch (NotSupportedException) { }
catch (ArgumentNullException) { }
catch (ArgumentOutOfRangeException) { }
catch (ArgumentException) { }
Run Code Online (Sandbox Code Playgroud)
use*_*116 11
在该列表中,我将考虑捕获的只有4个例外:
NotSupportedExceptionArgumentNullExceptionArgumentOutOfRangeExceptionArgumentException另外两个你永远不应该捕获,并且从后来的CLR中你无法捕获OOM情况(如果你需要找出,请考虑MemoryFailPoint).
深入研究Array.CreateInstance,我们会看到为什么会抛出这四个中的每一个:
NotImplementedException:你给它的类型不能是一个数组,或者是一个开放的泛型.由于您从固定列表中提取这些数据类型,因此您应该先验地知道这些类型是有效类型.我会反对处理这个例外.ArgumentNullException:你应该确定你传递的所有参数都不是null,因此这永远不会发生,你不应该处理这个异常.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);
Run Code Online (Sandbox Code Playgroud)
总之,我不会处理任何异常,因为您应该能够阻止所有这些异常发生,并且您不应该关心无法处理异常的实例.
| 归档时间: |
|
| 查看次数: |
1197 次 |
| 最近记录: |