頂点で例外をスローしても、キャッチした例外をログに記録できますか?

私は本当に最高のエラー処理戦略に取り組んでいます。私の目標は、識別できるすべての例外を処理し、データベース内のテーブルにログを記録し、ユーザーに何が起こったかに関する有用なメッセージを表示することです。

問題

I am using an auth provider for SSO OAuth from one Salesforce
instance to another. It’s generally working fine but the
registration handler has some complex logic, including a callout to
another org for verification of some data. Sometimes the callout
fails for a few different reasons and there are a handful of other
infrequent but notable registration errors that we wish to log. 問題
is that without throwing a custom exception, there is no way to
communicate to the error handler page for the auth provider what
happened, not that I see at least. Handled errors fail silently.
When I throw an exception in my reg handler, whatever logging I had
attempted gets rolled back.

私が試したこと

私はロギングを試してみましたが、登録ハンドラクラスの中のいくつかの場所のcatchブロックに例外をスローしました。私が言及したように、これはロギングがロールバックされてからのことではありませんでした。

私も例外をスローしないようにしようとしましたが、その後、regハンドラのロジックのいくつかが破壊されたり無視されたりします。私はまだ知られているエラーを処理した後に私のキャッチブロックのセーブポイントにロールバックしようとしていませんが、この時点でユーザーに役立つ何も表示できないかもしれませんが、

質問

Finallyブロックはいつ使用しますか?私自身の例外を投げるとき、それはどんな目的のためにも使うことができますか?

カスタムロギングを強制して例外をスローしながらデータベースに保存する方法はありますか?

私はここで何を試すべきですか?

最後に、これはどのように機能すると思いますか?例外とロールバックの後でさえ、頂点で続けることができるはずのロギングパスがあるようです。

ベストアンサー

まず、部分的な解決策/アプローチについては、この回答をご覧ください。

基本的にApexデベロッパーによる最終コミットのガイドライン

トランザクション管理はApexに焼き付けられます。つまり、ロールバックスコープを自分で管理する必要がない場合や、コミットされたDMLを受け入れる必要がない場合は、プラットフォームに例外を処理させる場合は常にロールバックされます。

要求全体が正常に完了すると、すべての変更がデータベースにコミットされます。たとえば、VisualforceページがApexコントローラと呼ばれ、追加のApexクラスが呼び出されたとします。すべてのApexコードの実行が終了し、Visualforceページの実行が終了した場合にのみ、変更がデータベースにコミットされます。要求が正常に完了しなかった場合は、すべてのデータベースの変更がロールバックされます。

これを制御する唯一の方法は、セーブポイントと一緒にtry/catch/finallyセマンティクスを使用することです。例外を投げないようにしてください(いくつかのシステム例外を悲しんで捕らえることはできません)。
Auth.RegistrationHandler
インタフェースの実装が滞っているためそのメソッドのシグネチャを持つため、エラーを戻すための代替手段をコーディングすることはできません。インタフェース自体にはこれがサポートされているようには見えません。

Passing a null user back from createUser. What
happens if you using try/catch/finally with a logging approach as
above and then null back? I expect the system will handle this and
present some general error message. Of course in this case your
more detail errors will have been logged, since technically the
call completed successfully. You would of course have to educate
your users/admins to check your own log in this case. Given the
frequency of the issues, perhaps this is tolerable? As regards the
updateUser method, i don’t see any way to infer
errors with a successful execution of the method.

Summary and System.debug? Sorry this is not the
answer you wanted, but i believe this is the situation. Your not
the first to want to implement such a logging approach as you can
see. Ultimately its a matter of how far your prepared to go against
the transaction management semantics of the platform vs resorting
to having your Admins enable Debug Logs and adding System.debug output to your code to
output messages to the standard platform log that can then be
reviewed for your errors.

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です