質問: 下記の質問を記述している際に、エラーメッセージを書く時の書式と分量を判断できずに悩んだ結果、スタックトレースを省略する形で投稿しました。 **※このメタ質問で頂いた回答を反映し、現在はスタックトレースを末尾に記述しています。** EPPlusのピボットテーブルでタイトル行が“<”を含むとXmlExceptionが発生する エラーメッセージを記述する際の書式や分量について、より良い質問をするための指針はあるのでしょうか。 ケースバイケースな部分もあるでしょうけれど、既存のルールや推奨される考え方があれば質問がしやすくなると期待しております。 1. 書式は何が良いのか 基本的な質問かも知れませんが、エラーメッセージはコードとブロック引用のどちらで記述するべきでしょうか。 今回の質問では、エラーメッセージはコードでないと判断してブロック引用を用いましたが、スタックトレースを省略せずに記載する場合はコードとして記述し、スクロールバー付きのフォームで表示した方が回答者の読みやすい質問ではないかと悩みました。 2. スタックトレースは書くべきか 同じ質問を抱いている第三者に対して、GoogleやYahooなど検索エンジンでのヒット率を上げるという観点では、スタックトレースを書くべきかと思います。 しかし今回の質問では、下記の観点からスタックトレースを省略したくなりました。 * 簡潔なコードで再現性がある * スタックトレースが.Netフレームワークを追う記述が多く、EPPlus固有のコードで解決する手掛かりが乏しいのではないか(質問者の独断) * スタックトレースの末尾でマイドキュメントのユーザ名が表示されるので、編集が面倒になった 3. エラーメッセージを一部省略することは推奨されるのか 今回のエラーメッセージ全文は下記の行数になりますが、前半と末尾の数行だけを質問に記述して「簡潔な質問」を目指すことは回答者が歓迎する質問につながりますか。 System.Xml.XmlException HResult=0x80131940 Message='<' (16 進数値 0x3C) は無効な属性文字です。 行 1、位置 458。 Source=System.Xml スタック トレース: 場所 System.Xml.XmlTextReaderImpl.Throw(Exception e) 場所 System.Xml.XmlTextReaderImpl.Throw(String res, String[] args) 場所 System.Xml.XmlTextReaderImpl.ParseAttributeValueSlow(Int32 curPos, Char quoteChar, NodeData attr) 場所 System.Xml.XmlTextReaderImpl.ParseAttributes() 場所 System.Xml.XmlTextReaderImpl.ParseElement() 場所 System.Xml.XmlTextReaderImpl.ParseElementContent() 場所 System.Xml.XmlTextReaderImpl.Read() 場所 System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace) 場所 System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc) 場所 System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace) 場所 System.Xml.XmlDocument.Load(XmlReader reader) 場所 OfficeOpenXml.XmlHelper.LoadXmlSafe(XmlDocument xmlDoc, Stream stream) 場所 OfficeOpenXml.XmlHelper.LoadXmlSafe(XmlDocument xmlDoc, String xml, Encoding encoding) 場所 OfficeOpenXml.Table.PivotTable.ExcelPivotCacheDefinition..ctor(XmlNamespaceManager ns, ExcelPivotTable pivotTable, ExcelRangeBase sourceAddress, Int32 tblId) 場所 OfficeOpenXml.Table.PivotTable.ExcelPivotTable..ctor(ExcelWorksheet sheet, ExcelAddressBase address, ExcelRangeBase sourceAddress, String name, Int32 tblId) 場所 OfficeOpenXml.Table.PivotTable.ExcelPivotTableCollection.Add(ExcelAddressBase Range, ExcelRangeBase Source, String Name) 場所 ConsoleApp1.Program.Main(String[] args) (C:\Users{Who am I}\Documents\Visual Studio 2017\Projects\ConsoleApp1\Program.cs):行 22
回答: 日本語版スタック・オーバーフローにおいて統一された指針は現状無いような気がしますが、私個人的にはエラーメッセージなどの**長大な出力**を貼る必要が有る場合は以下のようにしています。 1. コードブロックとして貼る コードブロックは、縦横に長過ぎる場合スクロールできる形になり、上下左右幅に制限がかかります。引用ブロックにはこの機能がありません。長大な出力を貼り付ける場合、コードブロックにするほうがページを圧迫しませんし、適度に読み飛ばせます。必要な人だけ中身を見れば良いようにできます。 また、引用ブロックの中身は普通の Markdown として扱われるため、特に行頭の半角スペースが無くなってしまいます (` ` にすれば解決できますが、面倒です)。したがってインデントが重要な場合や半角スペースでテキスト位置が調整されている場合、コードブロックを使う方が簡単です。 ところで GitHub Flavored Markdown だと `` タグを使って内容を折りたたんで隠すことができるのですが、Stack Exchange ではこの機能が使えません。省略したい場合はコードブロックが使える、ということで現状まとまっているようです。 また、コードブロックにすると色が付いてしまい嫌だ、ということであれば、`` を使えば色を消せます。 ログが複数種類あり、それぞれでコードブロックを分けている場合は、これでも質問文が縦に長くなることがあります。不必要に長いと感じられることもあるでしょう。その場合は、質問が解決してから適度に省略編集するのも良いかもしれません。投稿ごとに個別対応することになるでしょう。 2. 質問する場合、関係しそうな出力はなるべく省略しない 質問する際は、何が回答者へのヒントになるか分かりません。なので、秘密鍵など公開できない情報以外は見せて欲しいと思っています。質問者が貼り付けなかった部分に重要な情報があり、コメントで催促されている場面は時々目にします。 ただし場合によっては、いきなり出力全部を見せると投稿の内容が分かりにくくなることがあります。こういうとき私は、自分で思う重要そうな部分を質問の最初の方に書いた上で、出力全体は質問末尾にまとめています。まずは重要な部分を理解してもらって、瑣末なことや詳細なことは後から知ってもらおう、というやり方です。 また「全部」とはいえ、あまりにも巨大な内容を貼り付けようとすると投稿の文字数制限にひっかかります。この場合は内容を省略することを検討します。重要そうな部分を投稿に含めた上で全体は GitHub Gist や Pastebin など外部サイトに保存するのがオススメです。ただし外部サイトはいつかリンク切れするかもしれないのでご注意ください。ZIP などにまとめて添付するのは、セキュリティ上の懸念があるため避けます。 補足 以上の話はエラーメッセージについての話であり、ソースコードに関しては最小限の・自己完結した・確認可能なサンプルコードであると回答が付きやすいです。入力はなるべく短く、出力はあるだけ長く、という方が回答者が問題を把握しやすいからです。