如何在程序中区分不同的IOExceptions?

10

我正在为写入Process对象的StandardInput流的代码做一些异常处理。该进程有点像Unix中的head命令,它只读取其输入流的一部分。当进程终止时,写入线程会失败并出现以下异常:

IOException
The pipe has been ended. (Exception from HRESULT: 0x8007006D)

我想捕获这个异常并使其优雅地失败,因为这是预期的行为。但是,对我来说如何可靠地区分它与其他IOException并不明显。我可以使用message,但据我了解,这些是本地化的,因此在所有平台上可能无法正常工作。我也可以使用HRESULT,但我找不到任何文档指定此HRESULT仅适用于此特定错误。最好的方法是什么?


你要写入的流是什么类型?你能查询一下这个流是否已关闭,如果是的话就静默失败吗? - Jim Mischel
1
你不知道在看到异常时哪段代码正在运行吗?在那个特定的代码周围加上try/catch,然后处理你收到的任何异常。 - John Saunders
@JohnSaunders 问题在于我无法区分一种IOException和另一种。我知道在哪里放置try-catch,但不知道如何在catch中区分正确的异常。 - ChaseMedallion
调用接收此异常的一个方法时会发生多少种不同的IOException?无论如何,如果您将try/catch _立即_放置在接收异常的一行代码周围,并且如果您包括从IOException派生的异常的catch块,则只需忽略所有其余的IOException情况。 - John Saunders
1
@JohnSaunders: 老实说,我不知道有多少种不同类型的IOExceptions会发生。当尝试写入重定向标准输入流时,似乎任何数量的问题都可能出现。 - ChaseMedallion
是的,但你需要忽略它们。也许先记录一下。 - John Saunders
1个回答

5

使用Marshal.GetHRForException()来检测IOException的错误代码。以下是一些示例代码,可帮助您与编译器作斗争:

using System;
using System.IO;
using System.Runtime.InteropServices;

class Program {
    static void Main(string[] args) {
        try {
            throw new IOException("test", unchecked((int)0x8007006d));
        }
        catch (IOException ex) {
            if (Marshal.GetHRForException(ex) != unchecked((int)0x8007006d)) throw;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接