【问题标题】:detecting specific argument exceptions?检测特定的参数异常?
【发布时间】:2013-08-06 12:47:04
【问题描述】:

我需要捕获特定的 ArgumentException。

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

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

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

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

【问题讨论】:

  • 是什么引发了异常?我希望您能够调用相关方法之前验证条件,而不是通过捕获异常。 ArgumentException 表示 programming 失败 - 您通常不应该捕获它。
  • 使用制表符分隔的文件将行添加到表中。如果文件中的选项卡多于表列,则会引发此错误。该功能专为机器生成的文件而设计,这些文件永远不会出错,但有些人一直在生成文件以上传到 excel 中,这变得容易出错。我只是希望能够反馈给用户,而不是他们正在上传的文件中的列太多。

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


【解决方案1】:

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

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

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

【讨论】:

  • 要验证布局,我需要计算文本文件中每一行的制表符字符数​​...我该怎么做?
  • @Stuart:嗯,我会使用一些描述的 TSV 库,以便首先将纯文本数据转换为语义上更有用的形式。您也许可以只使用line.Split('\t') 就可以逃脱,但您可能需要考虑转义等。您没有告诉我们您正在使用的 API 的任何信息,这使得这很棘手。
【解决方案2】:

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

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

【讨论】:

  • 查看我对 Damien 回答的评论。
  • @JonSkeet:我认为我们在这里的波长相同。我暗示这是一个坏主意,说:“ArgumentExceptions 通常不应该被捕获,因为它们表示编程错误”。
  • 很公平,但我已经做了 first 的事情 - 我们不知道 OP“将不得不解析/分析异常消息”.. . 第一种方法应该这样做,而是避免异常。
【解决方案3】:

你必须抓住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 中)

【讨论】:

  • 在这里捕获异常是一个非常糟糕的主意。首先避免它发生。
  • @JonSkeet - 你假设他们的代码有一个简单的方法来事先询问表信息。情况可能并非如此。我们不知道他们正在处理什么 API 并从那里返回 ArgumentException
  • 这就是为什么我在添加答案之前询问有关上下文的问题 - 我会非常惊讶地发现一个 API 允许我向表中添加行而不提供查询元数据的方法。如果事实证明它不可能做到这一点,那么如果绝对必要,我们可以退回到捕获异常 - 但它应该被视为探索所有其他可能途径的最后手段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 2020-08-27
相关资源
最近更新 更多