加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 00:14:03 所属栏目:百科 来源:网络整理
导读:我正在用C#编写一个应用程序,它要求我从用户传入的某些维度动态创建一个Array对象.Array.CreateInstance()方法可以抛出(通过最后计数)我想要处理的6个不同的异常.对于每个异常,我都希望通过简单的MessageBox.Show()和针对异常情况的消息来通知用户.我不想做
我正在用C#编写一个应用程序,它要求我从用户传入的某些维度动态创建一个Array对象.Array.CreateInstance()方法可以抛出(通过最后计数)我想要处理的6个不同的异常.对于每个异常,我都希望通过简单的MessageBox.Show()和针对异常情况的消息来通知用户.我不想做的是捕获一般的异常类型,因为不这样做是最好的做法.我会尝试捕获ArgumentException或更具体的东西,但所有异常的唯一常见超类是Exception.

结论:我正在试图找出处理这么多不同异常的最佳方法,以及什么是有效的,更重要的是可维护的解决方案.

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

解决方法

在该列表中,我将考虑捕获的只有4个例外:

> NotSupportedException
> ArgumentNullException
> ArgumentOutOfRangeException
> ArgumentException

另外两个你永远不应该抓住,而在后来的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);

总之,我不会处理任何异常,因为您应该能够阻止所有这些异常发生,并且您不应该关心无法处理异常的实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读