如何获取System.Exception的内部“消息”值?

时间:2015-10-28 09:22:19

标签: c# exception reflection

我从第三方程序集中抛出了一个非常通用的FTP异常:

Exception of type 'JSchToCSharp.SharpSsh.jsch.SftpException' was thrown.

在检查Exception时,我看到有一个名为 message (小写m)的私人/内部成员,其中包含我的错误消息:

FTP Exception

如何获取此消息成员的价值?

我尝试使用反射来获取它,但是从 GetValue 返回null:

    BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
        | BindingFlags.Static;
    FieldInfo field = type.GetField(fieldName, bindFlags);
    var value = field.GetValue(instance);

    return value.ToString();

它似乎不是非公开静态所以我有点不确定如何使用 BindingFlags

由于

2 个答案:

答案 0 :(得分:2)

问题似乎是您要打印SftpException.Message而不是SftpException.message(请注意小写 m )。

图书馆的作者认为(出于未知原因)最好公开一个名为message的公共字段,而不是名为{{的属性。 1}},来自Message基类,但包含不同的内容。

这个例子:

Exception

收益“你好”。

请注意,您还可以使用自定义void Main() { try { throw new SftpException(1, "hello"); } catch (SftpException e) { Console.WriteLine(e.message); } } 上的ToString来打印实际的错误消息。这也可行:

SftpException

旁注:

我使用ILSpy查看Console.WriteLine(e.ToString()); 类以查看SftpException字段的访问修饰符。它看起来像这样:

ILSpy image of SftpException class

答案 1 :(得分:1)

从断点开始,您可以看到Exception不是一般例外,它有一个已知类型,因此您实际上可以将该异常类型捕获为:

try {
    ... 
} 
catch(JSchToCSharp.SharpSsh.jsch.SftpException ex1) {
   // I'm sure that ex1.Message will have what you need
}
catch(Exception ex2)
{
  // for any other Exception types...
}