【问题标题】:How to handle an unhandled exception of type 'System.ArgumentException'?如何处理“System.ArgumentException”类型的未处理异常?
【发布时间】:2015-12-09 00:10:05
【问题描述】:

我在 C# winforms 应用程序中列出所有 USB 应用程序,并尝试使用脚踏板播放音频。

我收到以下错误。

“System.ArgumentException”类型的未处理异常发生在 mscorlib.dll

附加信息:目标数组不够长,无法复制 集合中的所有项目。检查数组索引和长度。

private void ReadProcess(HidReport report)
{
    byte[] message = report.Data;
    uint _message;
    Array.Reverse(message);
    _message = BitConverter.ToUInt32(message, 0); // exception here!
    ....

【问题讨论】:

  • 在抛出此异常的语句处放置一个大箭头。并发布堆栈跟踪。
  • 我已经编辑了带有特定行抛出错误的问题以及完整的代码。请帮忙。
  • 异常信息已经包含了你需要的信息。缓冲区不够大,无法从中解码 32 位无符号整数。一个 32 位整数需要 4 个字节,为避免此问题,请检查缓冲区 (message) 的长度是否至少为 4 个字节。

标签: c# .net winforms hid


【解决方案1】:

如果您只想处理特定的异常,只需使用try/catch 并明确说明您要捕获的异常类型:

try
{
   byte[] message = report.Data;
   uint _message;
   Array.Reverse(message);
   _message = BitConverter.ToUInt32(message, 0);
} catch(ArgumentException ex)
{
   // Your logic...
}

由于您没有分享异常发生的确切位置,我无法确定要检查的内容,但您应该尽可能尝试验证参数并抛出您自己的异常或返回特定错误。

【讨论】:

    【解决方案2】:

    BitConverter.ToUInt32(byte[] value, int startIndex) 抛出 ArgumentException 当 startIndex 大于或等于 值的长度减 3,并且小于或等于 值减 1。

    问题出在report.Data,因为不符合要转换的要求。

    您始终可以将代码包装在 try-catch-finally 中并处理异常,但我建议您使用 read more about different type of exceptions and how you should handle them

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      相关资源
      最近更新 更多