2014-02-28 52 views
2

我得到这个例外“System.IO.IOException:操作成功完成”异常

System.IO.IOException: The operation completed successfully.

在下面的代码块

。此代码在Windows服务中运行。

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

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

+0

这是Powershell错误流。我正在调用PowerShell和读取错误流来检查错误。 – AccurateEstimate

回答

1

我想我在使用'重叠'流之前就已经看到过。这是一个可怕的错误信息

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

这试图访问的区域受限制的问题,诊断该错误的

+0

感谢您的回答。 “什么时候流重叠”是什么意思? – AccurateEstimate

+0

这是另一个误导性的术语。它比较接近异步流,但是在Win32中:http://en.wikipedia.org/wiki/Overlapped_I/O –

+0

你如何建议我解决它? – AccurateEstimate

0

部分(从IE浏览器的Internet区域下载时等)文件时,也可能会出现的情况是可能的,你处理返回的方法的结果错误掩盖了实际的异常位置。抛出从错误中检索到的异常直接清除堆栈跟踪。尝试包装提供的异常,而不是直接抛出它以获得更好的错误信息。然后检查堆栈跟踪以查看错误发生的位置。

创建一个自定义异常:

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

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

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