“System.IO.IOException:操作成功完成”异常

时间:2014-02-28 21:46:53

标签: c# powershell

我得到了这个例外

  

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操作,所以没有任何意义!

3 个答案:

答案 0 :(得分:1)

我想我以前在使用'重叠'流时已经看过了。这是一个可怕的错误消息

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

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

答案 1 :(得分:0)

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

创建自定义例外:

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);
    }
}

答案 2 :(得分:0)

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

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