none
System.Drawing.Image.FromFile FileNotFoundExceptionのメッセージについて RRS feed

  • 質問

  • 以下は、.NET 4.0及び.NET 4.6.1で確認しています。

    以下のようなコードを書いたのですが、File.ReadAllTextでスローされるFileNotFoundExceptionのMessageは"ファイル 'XXX' が見つかりませんでした。"
    と表示されるのですが、Image.FromFileから出力されるFileNotFoundExceptionのMessageはファイル名が格納されているだけです。

    static void Main(string[] args)
    {
        try
        {
            string text = System.IO.File.ReadAllText("C:\\a.txt");
        }
        catch (System.IO.FileNotFoundException exception)
        {
            Console.WriteLine(exception.Message);
        }
    
        try
        {
            System.Drawing.Image image = System.Drawing.Image.FromFile("C:\\a.bmp");
        }
        catch (System.IO.FileNotFoundException exception)
        {
            Console.WriteLine(exception.Message);
        }
    
        Console.ReadLine();
    }
    

    このような(不親切な)メッセージが表示されるケースは他に見たことがないのですが、Exception.Messageに格納される内容の確認は"やってみる"しかないのでしょうか。

    それとも、どこかに一覧等が公開されているでしょうか。

    ここを見るかぎり、大抵のメッセージは説明が含まれているようですが。

    2016年11月12日 17:22

回答

  • こんにちは。

    一覧がまとまっているのは見たことがないですね。

    前者の場合はWin32のエラーコードを元に専用メッセージを使用しています。
    https://referencesource.microsoft.com/#mscorlib/system/io/__error.cs,a2e22bc07d9bab0a

    後者の場合はファイルチェック後に.NET上でファイル名渡してるだけになってます。
    https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Image.cs,f7cc7221ba00597a

    細かく知りたいのであれば、実装見るしかないのでは?と思います。

    • 回答としてマーク Yuki Nishina 2016年11月13日 8:45
    2016年11月13日 3:38
    モデレータ

すべての返信

  • 例外は基本的に発生させるべきではありません。例外のデザインのガイドラインでも次のように説明されています。

    一般的なシナリオで例外をスローする可能性があるメンバーに対しては、例外に関連するパフォーマンスの問題を回避するために Tester-Doer パターンの使用を検討してください。

    つまり、今回であればFile.Exists()などでファイルの存在を確認すればそれで済む話です。

    という前提に立ったときに、例外メッセージはそれほど重要なのですか?

    2016年11月12日 21:31
  • 一部、佐祐理さんのレスとダブりますが・・・

    > このような(不親切な)メッセージが表示されるケースは他に見たことがないのですが

    開発者には理解できるのでそれで十分(不親切ではない)と自分は思います。

    例外を発生させる前に、開発者がファイルの有無を調べるコードを書いて、ファイルが存在しなければユーザーに適切なメッセージを表示し、ユーザーに対処してもらうことにより正常なフローに戻すことができるはずです。

    もし、一般ユーザーに対するメッセージとして、catch した Exception のメッセージを直接見せているとすると、それは開発者が不親切ということでは?

    例外処置について詳しく書いた MSDN Blog の記事を紹介します。参考になると思いますので、是非目を通してみてください。

    NETの例外処理 Part.1
    https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

    .NETの例外処理 Part.2
    https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

    #質問者さんの例とは違いますが、時々 Exception をキャッチする例を見ます。それは止めた方がいいようです。.NET 4 からは破損状態例外は catch できなくなっているそうですが、「それでも Catch (Exception e) を使用するのはよくない」ということについては以下の記事を見てください。

    破損状態例外を処理する
    https://msdn.microsoft.com/ja-jp/magazine/dd419661.aspx


    • 編集済み SurferOnWww 2016年11月13日 1:13 一部訂正
    2016年11月13日 1:04
  • こんにちは。

    一覧がまとまっているのは見たことがないですね。

    前者の場合はWin32のエラーコードを元に専用メッセージを使用しています。
    https://referencesource.microsoft.com/#mscorlib/system/io/__error.cs,a2e22bc07d9bab0a

    後者の場合はファイルチェック後に.NET上でファイル名渡してるだけになってます。
    https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Image.cs,f7cc7221ba00597a

    細かく知りたいのであれば、実装見るしかないのでは?と思います。

    • 回答としてマーク Yuki Nishina 2016年11月13日 8:45
    2016年11月13日 3:38
    モデレータ
  • 実装確認しました。

    確かにファイル名をFileNotFoundExceptionの引数に渡しているだけですね。

    .NETが実装したメッセージをそのままユーザーに表示させるのは避けるように考えます。

    デザインパターンの良し悪しについては、別で考えることとします。

    2016年11月13日 9:05