我需要捕获一个特定的ArgumentException。
System.ArgumentException:输入数组的长度大于 此表中的列。
我注意到可能会发生一些ArugmentExceptions,但我将如何专门捕捉这个? “输入数组比此表中的列数长”
不幸的是,catch(ArgumentException ex)
做得不够具体......
我们正在上传制表符分隔文件,上面的例外告诉我们告诉用户检查文件中的列数并重试。
答案 0 :(得分:5)
不要抓住异常 - 首先避免它发生。您有输入,因此您知道已提供了多少列。您知道要添加数据的表,因此您知道有多少列可用。
在尝试添加行之前,您可以 - 并且应检查数据的有效性。就这么简单。
ArgumentException
几乎从不被抓住并“处理”。它应该表示调用者提供了一个可以事先验证的错误参数 。这是一个编程问题,应该通过在调用端添加适当的代码来修复。
答案 1 :(得分:0)
您必须解析/分析异常消息,因为没有可用的额外信息。 ArgumentException
通常不会被捕获,因为它们表示编程错误。这就是没有额外信息的原因。
请注意,解析异常消息可能容易出错,因为您的应用程序可能会推广到具有不同文化的Windows计算机。在这种情况下,.NET版本可能会抛出本地化的异常消息。
答案 2 :(得分:0)
你必须抓住ArgumentException
,检查它,如果它不是你感兴趣的那个,重新抛出它。
catch(ArgumentException ex) {
if(ex.ParamName!="specificargument" || ex.Message != "Input array is longer than the number of columns in this table")
throw;
//Handle exception, inform user
}
(不同的检查可能更合适 - 即,检查整个消息文本可能不合适)
如果可以执行对特定类型的检查而不必重新进行throw
不匹配的异常,那就更好了 - 这正是发明了什么异常过滤器。不幸的是,C#从未出现过这个特征(尽管它存在于IL中,甚至暴露在VB.Net中)