質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • C#

    5742questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • 例外処理

    27questions

    例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

C# 例外処理が起きた場合、そのファイルパスと行数をテキストに出力したい

解決済

回答 3

投稿

  • 評価
  • クリップ 4
  • VIEW 276

o4273

score 1

前提・実現したいこと

当方C#初心者です。
現在、DBを使用したシステムのログ出力機能の作成をしています。
その際、DB関連のメソッドで例外処理が起きた場合、ソースのパスと行数(C:\hoge\hoge.cs 〇〇行目)の部分のみをテキストファイルに出力させたいのですが、StackTraceプロパティを使用すると余計な文字列まで入ってしまいます。
文字列を編集するのは好ましくないとのことなので、StackTraceの編集はあきらめました。

どのようにすれば実現できるのでしょうか..

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2018/01/22 10:52

    普通に不要な部分を捨てればいいだけのように思いますが、何をどうしたくて何が好ましくないのかわかりませんので他人に伝わるよう詳しく書いてください。

    キャンセル

  • Zuishin

    2018/01/22 10:55

    つまり、どのようにすれば(具体的で詳細な手段をお願いします)自分の思い通り(具体的なデータのサンプルをお願いします)にできるけれども、どの部分が思い通りにならないのかを書いてください。そうすれば思い通りにならない部分を修正する方法がみつかるかもしれません。

    キャンセル

回答 3

+4

こんにちは。

例外が発生した時のソースと行番号はスタックトレースに入っています。スタックトレースを使わない場合、全ての例外をthrowしているとこを修正する必要があります。文字列を修正するどころの騒ぎではありません。そもそもライブラリ側で投げているところを修正するのは無理ですし。

しかし、例外をログに残す目的は、本来バグ対応のために必要な情報を残すことです。
想定外の事象で発生した例外情報を記録に残し、デバッグするためです。
このような目的の場合、スタックトレースをログに残すのは非常に有用です。

再度、何のためにログを残すのか検討してみることをお勧めします。
もしも、その目的のためには呼び出し履歴がログに残ると不味い場合、その目的と理由を質問へ追記されると的確な回答が返ってくる可能性が高まりますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/22 12:27

    おそらくはC#のStackTraceの第二引数にtrueを指定するとファイル名や行番号が取れるという点をご存知でなかったのではないかと思います。また文字列を編集するのを避けるというのは質問者さんへ指示をした方が「ファイル名や行番号を取り出すAPIがあるはずだからスタックトレースを文字列化してそれから取り出すというような迂遠なことをせずに直接取り出す方法を調べなさい」のような意図だったのではないかと想像しました。ちなみに自分はこういうことがC#でできるという点を初めて知りました。MSDNをみたときメソッド名しか取り出せないと思い込んでいたのです・・・

    キャンセル

  • 2018/01/22 13:39

    KSwordOfHasteさん。
    catch(Exception e) { Trace.Writeline(e.StackTrace); }でたいへんお手軽に例外発生時のスタックトレースを出力できます。このe.StackTraceは文字列なので、これを編集して目的の情報を取り出すことは可能です。
    tacsheavenさんが書かれている方法なら、目的の情報をスマートに抽出できますね。これは知りませんでした。指示した人はこれを見つけることを期待したのかも?

    でも、多くのケースではなるべくスタックトレースは全部とって置いたほうが助かるので、良く目的を確認しておくべきとも思います。

    キャンセル

  • 2018/01/22 13:57

    コメントいただきありがとうございます。
    > 良く目的を確認しておくべき
    おっしゃるとおりと思いました。
    かつてC#アプリを知り合いの方に使っていただいた際、例外が起きてしまい「イベントビューアーでの見方が分からない」と言われて往生したことがありました。プロの方が作るちゃんとしたアプリだとログに必要な情報を記録しトラブルに備えるのでしょうね。そういう場面を想像すると「多くのケースではなるべくスタックトレースは全部とって置いたほうが助かる」というのはしごくもっともだと思いました。

    キャンセル

  • 2018/01/22 15:56

    どういう配布方法か分かりませんが、行番号はpdb(debugging symbol)がないと取得出来なかったと思います。https://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.getfilelinenumber(v=vs.110).aspx

    キャンセル

checkベストアンサー

+2

.NET Framework 4.5以降ででしたら、CallerInfo属性を使うと呼び出し元のメソッド名や行数を引数として取得できます。

ちょうど似たようなことをされているページです。
http://hensa40.cutegirl.jp/archives/3031

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

例外ハンドラ内(別に例外ハンドラ限定ではないですが)で、StackTrace.GetFrames メソッドを使用すると、StackTrace の各スタックを表すオブジェクトの配列として取り出すことができます。

この配列の [0] はこのメソッドを呼び出した場所になるので、例外のスタックトレースとしては[1]から後を順次見ればよいです。
各々の内容は StackFrame クラスなので、プロパティを見てログに書くかどうか選択することもできます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    5742questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • 例外処理

    27questions

    例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。