我需要捕获一个特定的 ArgumentException。
System.ArgumentException:输入数组长于此表中的列数。
我注意到可能会发生许多 ArugmentExceptions,但我将如何专门捕捉这个?“输入数组长于此表中的列数”
不幸的是,做catch(ArgumentException ex)
的不够具体......
我们正在上传一个制表符分隔的文件,上面的异常告诉我们告诉用户检查文件中的列数并重试。
我需要捕获一个特定的 ArgumentException。
System.ArgumentException:输入数组长于此表中的列数。
我注意到可能会发生许多 ArugmentExceptions,但我将如何专门捕捉这个?“输入数组长于此表中的列数”
不幸的是,做catch(ArgumentException ex)
的不够具体......
我们正在上传一个制表符分隔的文件,上面的异常告诉我们告诉用户检查文件中的列数并重试。
不要捕捉异常 - 首先避免它发生。您有输入,因此您知道提供了多少列。您知道要向其中添加数据的表,因此您知道有多少列可用。
您可以 - 并且应该在尝试添加行之前检查数据的有效性。就这么简单。
ArgumentException
几乎不应该被抓住和“处理”。它应该表明调用者提供了一个可以事先验证的错误参数。这是一个编程问题,应该通过在调用端添加适当的代码来解决。
您将不得不解析/分析异常消息,因为没有可用的额外信息。ArgumentException
s 通常不会被捕获,因为它们表示编程错误。这就是为什么没有额外的信息。
请注意,解析异常消息可能容易出错,因为您的应用程序可能会部署到具有不同文化的 Windows 机器上。在这种情况下,.NET 版本可能会引发本地化异常消息。
你必须抓住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中)