タグ付けされた質問 「error-handling」

エラーと例外の処理に関する質問。ウィキペディアによると、例外処理は、計算中に例外(特別な処理を必要とする異常または例外的なイベント)の発生に応答するプロセスであり、プログラム実行の通常のフローを変更することがよくあります。これは、特殊なプログラミング言語構造またはコンピューターハードウェアメカニズムによって提供されます。

11
クエリが存在しないオブジェクトを参照していることを示すために、REST APIは500 Internal Server Errorを返す必要がありますか?
私は、多数のIoTデバイスのデータを処理するサーバーに常駐するREST APIを使用しています。 私のタスクは、APIを使用してサーバーにクエリを実行し、デバイスに関する特定のパフォーマンス情報を収集することです。 ある例では、利用可能なデバイスとそれに対応する識別子のリストを取得し、その後、それらの識別子(GUID)を使用してサーバーに詳細を照会します。 サーバーは500 Internal Server Error、これらのIDのいずれかでクエリを返しています。私のアプリケーションでは、例外がスローされ、エラーの詳細が表示されません。Postmanで応答をより詳しく調べると、サーバーが以下を含む本文でJSONを返していることがわかります。 errorMessage: "This ID does not exist"。 サーバーが最初にIDを提供したという事実は無視してください。これは開発者にとっては別の問題です。 REST API 500 Internal Server Errorは、クエリが存在しないオブジェクトを参照していることを報告するためにを返す必要がありますか?私の考えでは、HTTP応答コードは、APIの内部メカニズムではなく、REST呼び出しのステータスを厳密に参照する必要があります。私が期待する200 OK問題のAPIに独自のだろうエラーと説明を含む応答、と。 REST呼び出しがどのように構成されているかによって、期待に潜在的な違いがあることがわかりました。 これらの例を考慮してください: http://example.com/restapi/deviceinfo?id=123 http://example.com/restapi/device/123/info 前者の場合、デバイスIDはGET変数として渡されます。404または500は、パス(/restapi/deviceinfo)が見つからないか、サーバーエラーになったことを示します。 2番目の場合、デバイスIDはURLの一部です。私はをよりよく理解しますが、404 Not Foundそれでもパスのどの部分が変数とエンドポイントとして解釈されるかに基づいて議論することができます。

6
エラーについてどのくらいの情報をユーザーに表示する必要がありますか?
アプリケーションは常にエラーをスローできます。このようなエラーが発生した場合、ユーザーにアプリケーションに要求したことが成功しなかったため、ユーザーに通知する必要があります。 ただし、ユーザーにはどの程度の情報を提供する必要がありますか?私たちのほとんどは、スタックトレースを表示しないことに同意すると思います(スタックトレースは、ユーザーに表示されるエラーメッセージに含まれるべきですか?)ユーザー。 たとえば、例外をサポートする言語(.net、java)には、共有する例外の種類、例外が発生した場所、および例外に沿った明確なメッセージがあります。これもユーザーに非表示にする必要がありますか?または、とにかくこれを表示する必要がありますか?または、一般的なメッセージを表示する必要がありますか?または、基になる例外が何であるかに基づいて、いくつかのメッセージの1つを表示する必要がありますか?

15
Try / Catchを論理演算子として使用するかどうかの引数[非公開]
Try-Catchブロックを論理演算子として使用する会社のアプリで素敵なコードを発見しました。 つまり、「何らかのコードを実行し、このエラーがスローされる場合、このコードを実行しますが、それがこのエラーをスローする場合、代わりにこの3番目の処理を実行します」。 表示される「else」ステートメントとして「finally」を使用します。 私はこれが本質的に間違っていることを知っていますが、戦いを始める前に、よく考えられた議論を望んでいました。 また、この方法でTry-Catchを使用するための引数がある場合は、教えてください。 疑問に思っている人にとっては、言語はC#であり、問​​題のコードは約30行以上あり、特定の例外を探しています。すべての例外を処理しているわけではありません。

7
エラー抑制に対する引数
私たちのプロジェクトの1つで、次のようなコードを見つけました。 SomeClass QueryServer(string args) { try { return SomeClass.Parse(_server.Query(args)); } catch (Exception) { return null; } } 私の知る限り、このようなエラーを抑制することは、元のサーバーの例外から有用な情報を破壊し、実際に終了する必要があるときにコードを継続させるため、悪い習慣です。 このようなすべてのエラーを完全に抑制するのが適切なのはいつですか?

9
あまりにも多くのアサートを書くことは可能ですか?
私は執筆の大ファンです assert開発中に発生する可能性のあるケースをキャッチする方法としてC ++コードでチェック。プログラムのロジックバグが原因で発生する可能性があります。これは一般的に良い習慣です。 しかし、私が書いたいくつかの関数(複雑なクラスの一部である)には5つ以上のアサートがあることに気づきました。それぞれが関数の事前条件と事後条件について考える必要があり、それらは本当にバグをキャッチするのに役立つので、それはまだ素晴らしいと思います。ただし、多数のチェックが必要な場合にロジックエラーをキャッチするためのより良いパラダイムがあるかどうかを尋ねるために、これをそこに置きたかっただけです。 Emacsのコメント:Emacsが私の選択のIDEであるため、アサートステートメントを少しグレー表示にして、提供できる混乱を軽減します。.emacsファイルに追加するものは次のとおりです。 ; gray out the "assert(...)" wrapper (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<\\(assert\(.*\);\\)" 1 '(:foreground "#444444") t))))) ; gray out the stuff inside parenthesis with a slightly lighter color (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<assert\\(\(.*\);\\)" 1 '(:foreground "#666666") t)))))

3
アドレス0000000Cは特別なアドレスですか?
プログラミングするとき、時々物事が壊れます。間違いを犯し、プログラムが間違ったアドレスから読み取ろうとしています。 多くの場合、これらの例外は次のようなものであることを私に際立たせます: Access violation at address 012D37BC in module 'myprog.exe'. Read of address 0000000C. 今、私は多くのエラーログを見て、私にとって際立っているのは、0000000Cです。これは「特別な」住所ですか?不正な読み取りを伴う他のアクセス違反が表示されますが、アドレスはランダムに見えますが、これはまったく異なる状況で繰り返し表示されます。

7
エラーを早期に「キャッチ」するツールとして例外を使用しても大丈夫ですか?
例外を使用して問題を早期に発見します。例えば: public int getAverageAge(Person p1, Person p2){ if(p1 == null || p2 == null) throw new IllegalArgumentException("One or more of input persons is null"). return (p1.getAge() + p2.getAge()) / 2; } 私のプログラムはnullこの関数を決して渡すべきではありません。私はそれをするつもりはありません。しかし、私たち全員が知っているように、プログラミングでは意図しないことが起こります。 この問題が発生した場合に例外をスローすると、プログラムの他の場所でさらに問題が発生する前に、それを見つけて修正することができます。例外はプログラムを停止し、「ここで悪いことが起こったので修正してください」と言っています。これnullがプログラム内を移動する代わりに、他の場所で問題を引き起こします。 さて、あなたは正しいです。この場合、これはただちにすぐにnull発生するNullPointerExceptionため、最良の例ではないかもしれません。 しかし、たとえば次のような方法を検討してください。 public void registerPerson(Person person){ persons.add(person); notifyRegisterObservers(person); // sends the person object to all kinds of …


6
ヌルポインターとヌルオブジェクトパターン
帰属:これは関連するP.SEの質問から生まれました 私のバックグラウンドはC / C ++ですが、Javaでかなりの仕事をしており、現在C#をコーディングしています。私のCのバックグラウンドのために、渡されたポインターと返されたポインターのチェックは間接的ですが、私はそれが私の視点にバイアスをかけることを認めています。 私は最近、オブジェクトが常に返されるという考え方のNull Object Patternの言及を見ました。通常の場合は、予想されるデータが設定されたオブジェクトを返し、エラーの場合は、nullポインターの代わりに空のオブジェクトを返します。呼び出し元の関数には常にアクセスするオブジェクトがあるため、NULLアクセスメモリ違反を回避するという前提があります。 それでは、Null Object Patternを使用する場合とNullチェックを行う場合の長所と短所は何ですか? NOPを使用すると、よりクリーンな呼び出しコードを見ることができますが、それ以外の場合には発生しない隠れた障害がどこで発生するかを確認することもできます。サイレントミスが野生に逃げるのではなく、開発中にアプリケーションをハードに失敗させます(別名例外)。 Null Object Patternには、nullチェックを実行しないのと同様の問題はありませんか? 私が扱ったオブジェクトの多くは、独自のオブジェクトまたはコンテナを保持しています。メインオブジェクトのすべてのコンテナに独自の空のオブジェクトがあることを保証するために、特別なケースが必要になるようです。ネストの複数の層でこれがwithいように思える。

4
機能的なスタイルの例外処理
関数型プログラミングでは、例外をスローしたり、観察したりすることは想定されていません。代わりに、誤った計算はボトム値として評価する必要があります。Python(または関数型プログラミングを完全に奨励していない他の言語)Noneでは、None何かが「純粋のまま」に失敗したときはいつでも返すことができますしたがって、最初にエラーを観察する必要があります。つまり、 def fn(*args): try: ... do something except SomeException: return None これは純度に違反しますか?もしそうなら、それは純粋にPythonでエラーを処理することが不可能であることを意味しますか? 更新 彼のコメントで、Eric LippertはFPの例外を処理する別の方法を思い出しました。実際にPythonでそれが行われるのを見たことはありませんが、1年前にFPを勉強したときに、Pythonで遊んでみました。ここで、任意のoptional-decorated関数はOptional、通常の出力および指定された例外のリストに対して空の値を返します(指定されていない例外でも実行を終了できます)。Carry遅延評価を作成します。各ステップ(遅延関数呼び出し)Optionalは、前のステップから空でない出力を取得して単純に渡すか、それ以外の場合はnewを渡して評価しますOptional。最終的に、最終値はnormalまたはEmptyです。ここでは、try/exceptブロックはデコレータの後ろに隠されているため、指定された例外は戻り値型シグネチャの一部と見なすことができます。 class Empty: def __repr__(self): return "Empty" class Optional: def __init__(self, value=Empty): self._value = value @property def value(self): return Empty if self.isempty else self._value @property def isempty(self): return isinstance(self._value, BaseException) or self._value is Empty def __bool__(self): …

3
C#では、なぜtryブロック内で宣言された変数のスコープが制限されていますか?
エラー処理を追加したい: var firstVariable = 1; var secondVariable = firstVariable; 以下はコンパイルされません: try { var firstVariable = 1; } catch {} try { var secondVariable = firstVariable; } catch {} 他のコードブロックが行うように、try catchブロックが変数のスコープに影響を及ぼす必要があるのはなぜですか?一貫性を別にして、リファクタリングなしでコードをエラー処理でラップできるのは理にかなっていますか?

2
Haskellでエラーを報告する最もクリーンな方法
私はHaskellの学習に取り組んでおり、私が書いた関数のエラーに対処する3つの異なる方法に出くわしました。 単にerror "Some error message."例外をスローするように書くことができます。 私は自分の関数を返すMaybe SomeTypeことができます。私は返すものを返すことができる場合とできない場合があります。 関数を返すEither String SomeTypeことができます。エラーメッセージまたは最初に返されるように求められたものを返すことができます。 私の質問は、どのエラー処理方法を使用すればよいのか、そしてその理由は何ですか?コンテキストに応じて異なる方法を使用する必要がありますか? 私の現在の理解は: 純粋に機能的なコードの例外に対処するのは「困難」であり、Haskellでは、できる限り純粋に機能的なものに保ちたいと考えています。 Maybe SomeType関数が失敗または成功する場合(つまり、失敗する可能性のあるさまざまな方法がない場合)は、返すことが適切です。 Either String SomeType関数がさまざまな方法のいずれかで失敗する可能性がある場合、返すことは適切なことです。

2
多層アーキテクチャ:エラー​​ロギング\処理を実装する場所
現在、多層アーキテクチャを使用して大規模なサブシステムをリファクタリングしており、効果的なエラーログ処理戦略の設計に苦労しています。 私のアーキテクチャは、次の3つのレイヤーで構成されているとしましょう。 パブリックインターフェイス(IE MVCコントローラー) ドメイン層 データアクセス層 私の混乱の原因は、エラーロギング\処理を実装する場所です。 最も簡単な解決策は、ログをトップレベル(IE Public Interface \ MVC Controller)に実装することです。しかし、これは間違っていると感じます。これは、異なるレイヤーを介して例外をバブリングし、ログに記録することを意味するためです。そのソースで例外をログに記録するのではなく。 私が最も多くの情報を持っているので、そのソースで例外をログに記録することは明らかに最適なソリューションです。これに関する私の問題は、すべての例外をキャッチせずにソースですべての例外をキャッチできないことであり、ドメイン/パブリックインターフェイスレイヤーでは、これはすでに下のレイヤーでキャッチされ、ログに記録され、再スローされた例外をキャッチすることになります。 もう1つの可能な戦略は、#1と#2の組み合わせです。これにより、スローされる可能性が最も高いレイヤーで特定の例外をキャッチし(SqlExceptionsつまり、データアクセスレイヤーでキャッチ、ロギング、再スロー)、トップレベルでキャッチされなかった例外をログに記録します。しかし、これはまた、すでにログに記録されたエラーと処理されていないエラーを区別できないため、トップレベルですべての例外をキャッチして再ログする必要があります。 さて、これは明らかにほとんどのソフトウェアアプリケーションの問題であるため、例外がソースで捕捉され、一度ログに記録されるこの問題の標準的な解決策が必要です。しかし、自分でこれを行う方法がわかりません。 この質問のタイトルは「多層アプリケーションでの例外のロギング」に非常に似ていますが、その投稿の回答には詳細が欠けており、私の質問に答えるには不十分です。

3
コマンドでの検証後エラーの処理方法(DDD + CQRS)
たとえば、登録フォームを送信するときは、有効な状態(例、電子メールアドレスの構文、年齢など)であることをDomain Model(WriteModelin CQRS)にチェックインする必要があります。 次に、を作成しCommand、それをに送信しますCommand Bus。 コマンドは何も返すべきではないことを理解しています。 では、エラーをどのように処理しますCommand Busか?(たとえば、1秒前に同じで登録したユーザーusername/email)。 そのコマンドが失敗したことをどのようにして知り、どのようにしてエラーを知っていますか?

3
値チェッカー関数はブール値とメッセージの両方を返す必要があります
私は、文字列で渡される値確認機能を持っています。これは、クレジットカード番号確認機能によく似ており、値が正しい形式であることを確認する必要があります。 適切な形式の場合は、trueを返す必要があります。 正しい形式でない場合は、falseを返す必要があり、値の何が問題なのかも教えてください。 問題は、これを達成する最も良い方法は何ですか? 以下にいくつかの解決策を示します。 1.整数/列挙戻りコードを使用して、意味を示します。 String[] returnCodeLookup = [ "Value contains wrong number of characters, should contain 10 characters", "Value should end with 1", "Value should be a multiple of 3" ] private int valueChecker(String value) { /*check value*/ return returnCode; } rc = checkValue(valueToBeChecked); if rc == 0 …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.