JavaのException.printStackTrace()と同等のC#?


83

Javaと同等のC#メソッドはありException.printStackTrace()ますか、それともInnerExceptionsを処理しながら、自分で何かを作成する必要がありますか?

回答:


120

これを試して:

Console.WriteLine(ex.ToString());

http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspxから:

ToStringのデフォルトの実装は、現在の例外をスローしたクラスの名前、メッセージ、内部例外でToStringを呼び出した結果、およびEnvironment.StackTraceを呼び出した結果を取得します。これらのメンバーのいずれかがnullの場合、その値は返される文字列に含まれません。

上記のコードToStringではSystem.ObjectToString直接呼び出しを行うオーバーロードがあるため、への呼び出しは必要ありません。


1
ただ、Linux上での.NETのコア2.1でそれを試してみましたが、もはや真実ではないようだ
selalerer

104

追加したい:例外の外でスタックを出力したい場合は、以下を使用できます:

Console.WriteLine(System.Environment.StackTrace);

10

Drewが言うように、例外を文字列に変換するだけでこれが行われます。たとえば、このプログラムは次のとおりです。

using System;

class Test
{
    static void Main()
    {
        try
        {
            ThrowException();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

    static void ThrowException()
    {

        try
        {
            ThrowException2();
        }
        catch (Exception e)
        {
            throw new Exception("Outer", e);
        }
    }

    static void ThrowException2()
    {
        throw new Exception("Inner");
    }
}

この出力を生成します:

System.Exception: Outer ---> System.Exception: Inner
   at Test.ThrowException2()
   at Test.ThrowException()
   --- End of inner exception stack trace ---
   at Test.ThrowException()
   at Test.Main()



0

JavaのLog4Jのように、引数として例外を受け取り、すべてを処理できるC#ロギングAPIはありませんか?

つまり、Log4NETを使用します。


MicrosoftがJavaが提供したような機能をC#で提供しなかった理由を指摘していると思います(より単純な時代に開発された古い言語であるため)。つまり、推奨されるより良い方法があります。
JeeBee 2008

0

@ ryan-cookの回答が機能しなかったため、例外なくスタックトレースを出力する場合は、次を使用できます。

System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace();
Console.WriteLine(stackTrace)

残念ながら、これはPCLまたは.NETStandardライブラリでは実行できません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.