Library」について説明してきましたが、今回はその最終回として、解析できなかった時に自動でエラーメッセージを表示したり、オプションの説明を表示したりする機能について説明します。†コマンドライン引数の解析に失敗した時、自動的に指定したメッセージを表示することができます。それには、OptionsクラスにStringを返すメソッドを作成して、HelpOption属性を適用し、表示したいメッセージを返すようにします。このメッセージは、アプリケーションに「--help」オプションを指定して起動した時にも表示されます。Optionsクラスに以下のようなGetUsageメソッドを追加すると、ParseArgumentsメソッドがFalseを返す時、コンソール(標準エラー出力)に「コマンドラインオプションの記述が正しくありません。"コマンドラインオプションの記述が正しくありません。"コマンドラインオプションの記述が正しくありません。前述したように、新しく作成したParserオブジェクトを使って解析を行った場合は、何も表示されない可能性があります。その場合は、HelpWriterプロパティをConsole.Errorにしてください。これについて詳しくは、後述します。補足GetUsageメソッドがなくても、解析に失敗した時(あるいは「--help」が指定された時)にメッセージを表示する方法があります。Parser.ParseArgumentsメソッドの代わりにParser.ParseArgumentsStrictメソッドを使って解析を行うと、自動的にメッセージが表示されます。この時表示されるメッセージは、後述するHelpText.AutoBuildメソッドを使って作成されたものです。ParseArgumentsStrictメソッドは、3番目の引数がない場合は、メッセージを表示後に自動的に「Environment.Exit(1)」を呼び出して、アプリケーションを終了させます。3番目の引数にデリゲートが指定されていた場合は、それを実行します。通常のコンソールアプリケーションでは、「/?」のようなオプションによって、使用法と使用できるオプションの説明が表示されます。LibraryではHelpTextクラスを使うことによって、オプションの説明文を簡単に作成することができます。そのための準備として、Option属性のHelpTextプロパティを使って、オプションに説明を記述しておきます。オプションがBoolean型ではなく、オプションの後に値を記述する必要があるならば、値の説明をMetaValueプロパティに記述します。このようにしておけば、HelpTextクラスのAddOptionsメソッドを使って、オプションの説明を作成できます。HelpText.AddPreOptionsLineメソッドによってオプションの説明の上に表示するメッセージを、HelpText.AddPostOptionsLineメソッドによって下に表示するメッセージを追加できます。このようにして、使用法とオプションの説明を表示する例を示します。'オプションの説明を追加。必須オプションの説明の前に付く文字列が"Required."になる。help.AddPostOptionsLine("詳しくは、ヘルプをご覧ください。//オプションの説明を追加。必須オプションの説明の前に付く文字列が"Required."になる。help.AddPostOptionsLine("詳しくは、ヘルプをご覧ください。}}このようにすると、解析に失敗した時、以下のように表示されるようになります。screen.詳しくは、ヘルプをご覧ください。「--help」というオプションによってもGetUsageが返すメッセージを表示することができますが、この名前を変更することもできます。このオプションは、GetUsageメソッドに適用されているHelpOption属性によって決められており、Option属性と同じ方法(前号で説明しています)でオプション名を変更できます。HelpOptionもHelpTextプロパティによって、「--help」オプションの説明を記述(変更)できます。GetUsageメソッドに適用するHelpOption属性を次のように変更してみましょう。GetUsage()するとメッセージは「-?」で表示できて「--help」では表示できなくなり、メッセージの内容も以下のように変わります。この説明画面を表示します詳しくは、ヘルプをご覧ください。†Optionsクラスに、ParserState属性を適用したIParserStateのプロパティを用意すると、解析に失敗した理由を知ることができるようになります。分かるのは、必須のオプションが指定されていない時、フォーマットが間違えている時、排他的なオプションが指定されている時のみです。不明なオプションが付けられていた場合は、GetUsageメソッドは呼び出されますが、この方法ではエラーの原因を知ることはできないようです。エラーがあった時は、HelpText.RenderParsingErrorsTextメソッドによってエラーメッセージを自動的に作成できます。これらを使用した例を以下に示します。'エラーメッセージを取得する。インデントは2とする。help.AddPreOptionsLine("理解できないオプションが含まれています。help.AddPreOptionsLine("以下に使用できるオプションの一覧を示します。//エラーメッセージを取得する。インデントは2とする。help.AddPreOptionsLine("理解できないオプションが含まれています。help.AddPreOptionsLine("以下に使用できるオプションの一覧を示します。}}上記のコードで、必須オプションの欠落とフォーマットのエラーがあった時に表示されるメッセージは、以下のようになります。screen.さらに説明を補足します。上記の例では、エラーの原因が「this.LastParserState.Errors」にコレクションとして格納されます。「this.LastParserState」がnullの時は「--help」オプションで表示した時で、「this.LastParserState.Errors.Count」が0の時は不明なオプションが指定された時だと思われますが、これはあくまで推測です。「this.LastParserState.Errors」はParsingErrorオブジェクトのコレクションですが、ParsingErrorクラスが持つ3つのBoolean型のプロパティ、ViolatesRequired、ViolatesFormat、ViolatesMutualExclusivenessによって、エラーの理由が分かります。ViolatesRequiredがTrueなら必須のオプションが指定されていない、ViolatesFormatがTrueならフォーマットが間違いている、ViolatesMutualExclusivenessがTrueなら排他的なオプションが指定されている時です。ParsingErrorオブジェクトのBadOptionプロパティによって、エラーの原因となったオプションの名前が分かります。これらを駆使してエラーメッセージを自分で作成することができますが、上記の例では手を抜いて、RenderParsingErrorsTextメソッドで自動的に作成しています。RenderParsingErrorsTextメソッドで作成したエラーメッセージは英語ですが、これを日本語にする方法は、後述します。†HelpText.AutoBuildとHelpText.DefaultParsingErrorsHandlerを使えば、たった1行でメッセージを作成できます。current));}このようにした時に表示されるメッセージは、例えば次にようになります。(ここでは、2つのエラーが発生しています。screen.この中で、「TestApplication」というのはアプリケーションのアセンブリ情報で「タイトル」に指定されている文字列です。2013」は「著作権」、「DOBON!」は「会社名」です。アセンブリ情報を変更すると、ここに表示される内容もそれに合わせて変わります。補足このようなアプリケーションのタイトルとバージョンの説明はHeadingInfo.Defaultで、著作権と会社名の説明はCopyrightInfo.Defaultで取得できます。「AssemblyInfo.cs」(VB.NETでは「AssemblyInfo.vb」)でAssemblyLicense属性を使うとライセンス情報を、AssemblyUsage属性を使うとアプリケーションの使い方を表示できるようになります。AssemblyInfo.csに次のような記述を追加したとします。"このアプリケーションは、MITライセンスで公開します。"このアプリケーションは、MITライセンスで公開します。--output=ファイル")]するとエラーメッセージは、次のように変わります。missing.このアプリケーションは、MITライセンスで公開します。†RenderParsingErrorsTextやAutoBuild(DefaultParsingErrorsHandler)では、エラーメッセージが英語で表示されます。BaseSentenceBuilderの派生クラスを作成すると英語以外でも表示できるようなので、試してみました。以下のようなBaseSentenceBuilderの派生クラス「JapaneseSentenceBuilder」を作成します。}}このクラスを使えば、RenderParsingErrorsTextやDefaultParsingErrorsHandlerが返すエラーメッセージを日本語にできます。先ほどのようにAutoBuildメソッドを使って1発でメッセージを作成する時には、このクラスを使って日本語化する方法が用意されていません。それでもあえてAutoBuildを使う場合は、例えば以下のような方法が考えられます。help;}すると、エラーメッセージは以下のようになります。2013このアプリケーションは、MITライセンスで公開します。screen.エラーメッセージが表示される位置が変わりましたが、エラーメッセージが日本語化されました。前に触れましたが、ParserクラスのHelpWriterプロパティによって、メッセージが出力される先が決まります。HelpWriterプロパティにStreamが指定されていればそのStreamに書き込み、nullであればどこにも書き込みません。Parser.DefaultのHelpWriterはConsole.Errorなので、標準エラー出力ストリームに書き込みます。新しく作成したParserオブジェクトのHelpWriterはnullなので、どこにも書き込みません。コンソールアプリケーションであれば標準エラー出力ストリームへの書き込みで問題ないかもしれませんが、Windowsフォームアプリケーションであればそうもいかないでしょう。そのような場合は、例えばParserのHelpWriterプロパティをStringWriterにすることで、メッセージを取得することができます。以下にその例を示します。Libraryについて長々と説明してきましたが、今回で終わりにします。紹介していない機能もいろいろありますので、興味のある方は調べてみてください。