質問: new StackFrame(); throw new Exception(sf.GetMethod().Name + "=>" + ex.Message); } ``` **【参考】** System.Environment.StackTrace プロパティ System.Diagnostics.StackTrace クラス
回答: 2つあるわけではありません。 `Environment.StackTrace`プロパティは ``` public static string StackTrace { [MethodImpl(MethodImplOptions.NoInlining)] // Prevent inlining from affecting where the stacktrace starts get => new StackTrace(true).ToString(System.Diagnostics.StackTrace.TraceFormat.Normal); } ``` とあるように`System.Diagnostics.StackTrace`インスタンスを作成して`ToString()`を呼んでいるだけです。コメントにもあるようにインライン展開されてしまうと期待するスタックトレースが得られない可能性もあり、そういったケアも行われています。 つまり書式に特にこだわらずスタックトレース文字列を簡単に入手したい場合は、`Environment.StackTrace`プロパティを使えばよく、それには満足できず、出力内容にこだわる場合は、`System.Diagnostics.StackTrace`を使いましょう。 > > この質問の動機は、メソッド内のエラー処理において下記のような書き方を思い立ったためです > > > 予約済みの属性:呼び出し元情報を判断するで説明されていますが、呼び出し元のメソッド名を入手する方法が用意されています。 メソッド引数に ``` [CallerMemberName] string memberName = "" ``` を加えると、`memberName`には呼び出し元のメソッド名やプロパティ名が渡されます。 この機能は.NET Framework 4.5以降で使えます。