簡體   English   中英

如何獲取System.Exception的內部“消息”值?

[英]How can I get the internal “message” value of a System.Exception?

我有一個非常通用的第三方程序集拋出的FTP異常:

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

在檢查Exception時,我看到有一個名為message (小寫m)的私有/內部成員,其中包含我的錯誤消息:

FTP異常

如何獲得此郵件成員的價值?

我試圖使用反射來獲取它但從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

謝謝

問題似乎是你打印出SftpException.Message而不是SftpException.message (注意小寫的m )。

該庫的作者認為(出於未知原因)最好公開一個名為message的公共字段,而不是名為Message的屬性,該屬性來自Exception基類,但包含不同的內容。

這個例子:

void Main()
{
    try
    {
        throw new SftpException(1, "hello");
    }
    catch (SftpException e)
    {
        Console.WriteLine(e.message);
    }
}

收益“你好”。

請注意,您還可以在自定義SftpException上使用ToString來打印實際的錯誤消息。 這也有效:

Console.WriteLine(e.ToString());

邊注:

我使用ILSpy查看SftpException類以查看message字段的訪問修飾符。 它看起來像這樣:

ILFy SftpException類的圖像

從你的斷點你可以看到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...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM