检测特定的参数异常

本文关键字:参数 异常 检测 | 更新日期: 2023-09-27 18:26:33

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

System.ArgumentException:输入数组的长度超过列。

我注意到可能会出现许多ArugmentException,但我该如何具体捕捉这一个呢?"输入数组比该表中的列数长"

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

我们正在上传一个选项卡分隔的文件,上面的异常告诉我们告诉用户检查文件中的列数,然后重试。

检测特定的参数异常

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

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

ArgumentException几乎不应该被捕获和"处理"。它应该指示调用者提供了一个错误的参数,该参数本可以事先验证。这是一个编程问题,应该通过在调用端添加适当的代码来解决。

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

请注意,解析异常消息可能容易出错,因为您的应用程序可能会被推出到具有不同区域性的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中公开)