エラーコードをどのように割り当てますか?


13

中規模のプロジェクトを開発する際に、エラーコードを特定、作成、および維持する方法を教えてください。

私の人生では、そうするためのシンプルでクリーンな方法を考えることはできません。私のアイデアのいくつかはクラス名とメソッド名を整数文字列に変換しますが、それはメソッド名とクラス名が変更される可能性があるという事実の上にユーザーに表示するのに長い道のりです(うまくいけない!)その他は、増分ログシステムを使用しているだけです(つまり、新しいエラーメッセージを作成するたびに、最後のエラーメッセージIDに1を追加するだけです)。しかし、それはまったく組織化されていません。

具体的には、次のようなエラーコードについて説明します。

Error 401 Unauthorized.


1
エラーコード?「マジックナンバー」が好きですか?たとえば... ERROR001。その後、リストに移動してERROR 001を読むと、bla bla bla ...という意味になりますか?はい?
-wleao

@wleao-はい。それを網羅するように質問を編集します。ありがとうございました。
-ahodder


質問で編集したとおり。彼らがhttpでどのようにそれを行うかを見てください。マジックナンバーを使用するのが良い考えかどうかはわかりません。しかし、あなたが本当にそれをやる気があるなら、彼らの概念に従ってください。たとえば、エラーの分類法があります(それはありますか?)。
-wleao

@wleao-まだではありませんが、あなたとPéterTörökに感謝します。:)
ahodder

回答:


16

番号。

エラーコードは時代錯誤であり、出力が非常に困難で高価だった昔から生じています。 pdp11 / 70フロントパネル

最近では、ほとんどすべての主流言語に組み込まれた成熟した例外処理があります。これを使って。作業できるユーザー情報を提供します。技術的な何とかして彼らに迷惑を掛けないでください、むしろ彼らに大雑把に何がうまくいかなかったか、彼らがそれについて何ができるかを伝えてください。ロギングの場合は、例外にわかりやすい名前を付けて、名前を記録してください。覚えやすく、grepまたは同様の検索ツールを使用して簡単に見つけることができます。

もちろん、例外は、組み込みシステムやネットワークプロトコルなど、出力が依然として困難で高価な状況向けにプログラミングしている場合です。HTTPは、効率的に解析するのが非常に簡単であるため、依然として数値の応答コードを使用します。状況によっては、最初の桁を読み取るだけで十分なことがわかり、残りのパケットを破棄できます。


詳細な答えをありがとう。
-ahodder

イラストの使用は、あなたの主張と完全に一致します。私はPDP-11について永遠に読みました。しかし、これは実際に私が見た最初のものです。ありがとう。
マイクオーウェンズ

2
コードの内部では、エラーコードを処理したいのですが、それほど古くはありません。
-JeffO

@Jeff:エラーコードを使ってできることは、例外を使用して行うこともできます。例外付きのエラーコードを模倣したい場合は、エラーコードを返す代わりにスローし、戻り値をE_OK(またはOK応答が何であれ)と比較する代わりにキャッチするだけです。公平を期すために、Cには実際の例外はなく、ロングジャンプはそれほど便利ではないため、Cを実行している場合は、多少の免除が必要です。
tdammers

@マイク:画像はPDP-11シリーズに関するウィキペディアの記事からのものです。それが簡単に見つけられない場合、私は何がわからない。
tdammers

6

HTTPなどの一般的なプロトコルでエラー/ステータスコードがどのように構成されているかを確認する必要があります。これらは、さまざまなタイプのステータス/エラーに対して異なる範囲を予約しています。これにより、ユーザーが未知のステータスコードを識別しやすくなり、開発者が以前に処理されていない新しい種類のエラーにコードを割り当てることが容易になります。


答えに分類法を追加します。エラーの管理と保守が容易になります。
-wleao

3

申し訳ありませんが、なぜエラーコードを使用するのですか?
例外をキャッチし、ログに記録して、プログラムが回復できない場合にレポートを送信するよう提案します。

(言語が例外をサポートしていると仮定します。)

バグの修正に役立つ可能性がある唯一の関連情報は、エラーコードで取得できないスタックトレースです。(また、エラーレポートにエラーコードを使用し、ユーザーの顔にそれらを投げたくないと仮定しています。)


それは非常に真実であり、私はそれを行いますが、ユーザーに何を伝えますか?彼らが行商をしていて、アプリケーションが死ぬだけで、説明も発煙するものもないなら、彼らは生き生きとしていると確信しています。
-ahodder

6
ここで混乱する少なくとも3つの異なるものがあると思います。1つ目は、HTTPのように、ソフトウェアからソフトウェアに使用されるコードです。2番目は、ユーザーがエラーレポートで使用できるコード(インシデント番号など)です。最後は、ユーザーに表示できるメッセージです。それらを別のものとして考えると役立つ場合があります。
ダリエン

2
エラーコードを使用する大きな理由の1つは、バックエンドアプリケーションを構築している場合です。エラーメッセージやスタックトレースよりも、クライアントプログラムがコードを解釈して応答する方がはるかに簡単でエレガントです。すべてのエラーがバグによるものではありません。
カイプロII

1
例外を正すのは非常に難しいです!次のリンクを参照してください:Programmers.stackexchange.com/questions/97874/…–
コーダー

@Coder:あなたの例は例外を悪用します。あなたはあなたが投げられると予想するものを捕らえるべきです。ほとんどのメソッドは、1つの例外がスローされることを期待する必要はありません。を処理するを決定するのは完全にプログラマーの責任であり、それを正しくするのは難しいかもしれません。
ダン

2

手続きのコンテキストを想定します(C)。オブジェクトがある場合、例外かどうかに関係なく、通常エラーオブジェクトの方が優れています。

各モジュールにローカルなエラーコードを使用する必要があります。ライブラリの場合、エラーコードをリストする特別なヘッダーを使用できます。番号は1、2など(必要に応じて-1、-2)です。これらのコードのいずれかを必ず返すようにしerrnoてください。たとえば、独自のコードに変換してください。モジュールのレイヤーが複数ある場合は、各ステップで翻訳します(または、より深いエラーの範囲を事前定義します。たとえば、値1001〜1050は他のモジュールのものです)。

また、コードを文字列に変換する手段を提供することも重要です。フラストレーションにつながるだけのコードのみを報告しないでください。実際、アプリケーションのほとんどすべてのコードには、文字列変換機能が必要です。たとえば、libcには通常strerrorand strsignalがありstrwaitstatusますが、残念ながら欠けています。


素晴らしいディテール、ありがとう。これは実際に非常に役立ちます。
アホダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.