【问题标题】:"System.IO.IOException: The operation completed successfully" exception“System.IO.IOException:操作成功完成”异常
【发布时间】:2014-02-28 21:46:52
【问题描述】:

我遇到了这个异常

System.IO.IOException:操作成功完成。

在下面的代码块中。此代码在 Windows 服务中运行。

foreach (var error in _currentPowerShell.Streams.Error)
{
    if (!string.IsNullOrEmpty(error.FullyQualifiedErrorId))
    {
        if (!(error.CategoryInfo.Activity == "Get-Alias"))
            throw error.Exception;
    }
}

完全没有意义,因为我没有做任何IO操作!

【问题讨论】:

  • 这是 Powershell 错误流。我正在调用 powershell 并读取错误流以检查错误。

标签: c# powershell


【解决方案1】:

我想我以前在使用“重叠”流时看到过这种情况。这是一个可怕的错误信息

这是一个重叠 I/O (IOCP) 完成状态。抛出的 异常记录为“发生 I/O 错误”。它具有“操作成功完成”消息的误导性。

这也可能发生在尝试访问受区域限制的文件时(例如从 IE 从 Internet 区域下载时)

【讨论】:

  • 感谢您的回答。 “当流重叠时”到底是什么意思?
  • 这是另一个误导性术语。它更接近异步流,但在 Win32 中:en.wikipedia.org/wiki/Overlapped_I/O
  • 多一点上下文会有所帮助。阅读_currentPowerShell之前你在做什么?
  • 我正在像这样调用 powershell:var results = this._currentPowerShell.Invoke();
  • 能否请您扩展您的问题,以及您正在调用的示例(powershell 包装器正在运行什么?)
【解决方案2】:

您诊断此错误的部分问题可能是您处理返回的错误的方式掩盖了实际异常位置的结果。抛出从错误中检索到的异常会直接清除堆栈跟踪。尝试包装提供的异常而不是直接抛出它以获得更好的错误信息。然后检查堆栈跟踪以查看错误真正发生的位置。

创建自定义异常:

public class PSException : Exception
{
}

然后更改您的代码以包装 PowerShell 错误中的异常:

foreach (var error in _currentPowerShell.Streams.Error)
{
    if (!string.IsNullOrEmpty(error.FullyQualifiedErrorId))
    {
        if (!(error.CategoryInfo.Activity == "Get-Alias"))
            throw new PSException("An error occurred in the PowerShell instance.", error.Exception);
    }
}

【讨论】:

    【解决方案3】:

    据我了解,您正在自己的主机中运行 PowerShell 脚本(我说的对吗?)。在这种情况下,您可以像在 C# 中捕获异常一样,捕获在脚本执行期间发生的所有异常。为此,您只需在脚本中设置 $ErrorActionPreference = "Stop"。

    希望这将帮助您获得有关您遇到的错误的更多信息。您也可以使用这种方法而不是读取流中的错误。如果您需要本地化程序,它只是读取流并解析它们会非常糟糕。

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 2011-01-22
      • 2016-08-29
      • 2022-11-16
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2012-02-12
      相关资源
      最近更新 更多