检测特定的参数异常?

时间:2013-08-06 12:47:04

标签: c# asp.net try-catch argumentexception

我需要捕获一个特定的ArgumentException。

  

System.ArgumentException:输入数组的长度大于   此表中的列。

我注意到可能会发生一些ArugmentExceptions,但我将如何专门捕捉这个? “输入数组比此表中的列数长”

不幸的是,catch(ArgumentException ex)做得不够具体......

我们正在上传制表符分隔文件,上面的例外告诉我们告诉用户检查文件中的列数并重试。

3 个答案:

答案 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中)