1

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

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

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

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

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

4

3 回答 3

5

不要捕捉异常 - 首先避免它发生。您有输入,因此您知道提供了多少列。您知道要向其中添加数据的表,因此您知道有多少列可用。

您可以 - 并且应该在尝试添加行之前检查数据的有效性。就这么简单。

ArgumentException几乎应该被抓住和“处理”。它应该表明调用者提供了一个可以事先验证的错误参数。这是一个编程问题,应该通过在调用端添加适当的代码来解决。

于 2013-08-06T13:08:54.550 回答
0

您将不得不解析/分析异常消息,因为没有可用的额外信息。ArgumentExceptions 通常不会被捕获,因为它们表示编程错误。这就是为什么没有额外的信息。

请注意,解析异常消息可能容易出错,因为您的应用程序可能会部署到具有不同文化的 Windows 机器上。在这种情况下,.NET 版本可能会引发本地化异常消息。

于 2013-08-06T12:49:50.527 回答
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中)

于 2013-08-06T12:50:45.703 回答