例外またはエラーコード


12

(主に)ネイティブクライアント(Windows、C ++)と通信するWebサービス(SOAP、.Net)を構築しており、クライアントにエラーを伝える最良の方法は何かを考えています(例:ログインサービスが利用できないSomethingBadHappenedまたはユーザーが見つからないなど)、クライアントに例外をスローするか、上記を行うために何らかのエラーコードモデルを使用するかを決定できませんでした。

クライアント側の処理であなたが好むもの:エラーコードを受け取るか、エラーの理由を含むServerFault例外を処理しますか?
1)なぜ例外を考えているのか:サーバー側のコードをより均一にするから
2)エラーコードを考えているのはなぜか:クライアント側の観点からより理にかなっていると考えるから

2)が本当に当てはまる場合、例外よりもエラーコードを探したいのでしょうか?それはここですか?

また、ネイティブクライアントではなくマネージドクライアントと通信している場合、答えは変わりますか?


少し明確にするために:a)ここでベストプラクティスとクライアントサイドからの経験を探しています(クライアントはもっと複雑で、クライアントコードをよりシンプルに保つことができるなら、サーバーサイドで処理したいので)b)クライアントには多くのレガシーコードが含まれており、C ++例外を使用できる場合とできない場合があります。
アミットワッダ

これが役立つ場合があります-www.codeproject.com/KB/cpp/cppexceptionsproetcontra.aspx
グルシャン

回答:


8

SOAPには障害の概念があり、サーバー側で例外を障害に変換できます。クライアントプロキシでは、障害を再び例外に変換できます。これは、WCFおよびJavaメトロスタックで非常にうまく機能し、ネイティブC ++クライアントについてコメントすることはできません。

SOAのベストプラクティスに関しては、クライアントが特定の種類のエラーを異なる方法で処理する必要がある場合にのみ、1つの一般的な障害といくつかの特定の障害を定義します。実稼働展開では、例外スタックトレースをクライアントに送信しないでください。これは、理論上、サーバートレースはクライアントにとってもセキュリティ上の理由からも意味がないためです。サーバーに完全なエラーとスタックトレースを記録し、障害のログに一意の参照を送信します。WCFでは、エンタープライズライブラリのMicrosoft Exception Handlingブロックを使用してGUIDを生成し、例外をSOAPエラーに変換します。

Microsoft Patterns and Practicesのガイダンスを確認してください。


ありがとう、これはいいですね。そこのページ内のより具体的なリンクを教えてください。
アミットワッダ

また、などのようなUserNotFoundに関するビジネスレベルのエラーはこれらも例外として扱われるべきもの
アミットWadhwa

過去のプロジェクトでは、コードの例外やSOAPのフォールトを使用せずに、正当な/予想される障害モードを伝えていました。エラーコードを使用し、それらをクライアントに任せて、エラーの処理方法を決定しました。見つからないユーザーは、実際にはエラー/例外ではありません。これはおそらくステータスコードです。
MrLane

4

私は最近、呼び出し元に例外を報告できるJava 6ライブラリを使用してWebサービスを実行しました(自動的に行われる方法については検討していません)。

エラーレポートでクライアントにスタックトレースを開発者に提供させる機能は非常に便利です(おおよそのタイムスタンプを取得し、ログに記録する場合はログで調べる必要があります)。

したがって、開発者の観点から見ると、例外を使用してください。


1
これはドッグフードとベータ版で役立つ可能性があることに同意しますが、実際の使用状況でイベントログまたはログファイルにスタックトレースを吐き出したいと思います)
アミットワッダ

2
@Amit、これについて私を信頼してください。実稼働環境でスタックトレースが発生する状況に遭遇した場合、スタックトレースが必要です。

1
クライアント側のスタックトレースの利点は何ですか。クライアントに渡す前に、サーバー側ですべての例外を確実に記録します。
アミットワドワ

また、などのようなUserNotFoundに関するビジネスレベルのエラーはこれらも例外として扱われるべきもの
アミットWadhwa

-2

Webサービスの場合、クライアントがキャッチする例外をサーバーに正確にスローさせることはできません。インターフェースでは、サーバーは基本的に何らかのエラーコードを返す必要がありますAn exception occurred. Type %s, message %s, stack trace %s

クライアント側については、応答読み取りコードに応答をチェックさせて、エラーが含まれているかどうかを確認し、クライアント側で例外を発生させることができます。少なくとも例外処理が適切に行われている言語では、これは非常に優れた方法です。ただし、C ++には適切な例外処理はありません。C++例外から可能な限り遠ざけることをお勧めします。より良い言語を使用できない場合は、エラーコードに固執するだけです。


私がキャッチされない例外がクライアントにServerFaultのように行くだろうと思います
アミットWadhwa

3
C ++またはC ++の例外には何も問題はありません。特定のプロジェクトでC ++以外の言語を使用する理由はたくさんありますが、例外処理はその1つではありません。
-KeithB

セキュリティのベストプラクティスに反しているだけでなく、クライアントはサーバーのスタックトレースを正確にどのように処理する必要がありますか?それを印刷してあなたに送ってください?メールで送信しますか?潤滑紙に使用しますか?
JensG

@JensG:これがWebサービスであり、Webサイトではない場合、クライアントはバグ報告としてあなたにメールを送るのに十分な専門家でなければなりません。
メイソンウィーラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.