問題:
オブジェクトが初期化されていないために失敗しているコードがあります。このバグの解決策は、検出されたときに簡単に修正できます。しかし、私を驚かせたのは、私の手の込んだ例外処理がこの例外をキャッチしなかったことです。これは、例外がログに記録または処理されず、trycatchブロックに続くコードが実行されなかったことを意味します。try ... catchブロックはトランザクションの外部にあったため、問題はありませんでした。
この特定のケースでは、例外はバッチ(RunBaseBatch)ジョブ内にありました。ジョブは、いくつかの無関係な処理タスクを処理しました。例外条件が満たされると、ジョブは終了したため、他の無関係な処理タスクは呼び出されませんでした。
Dynamics AX 2009で「オブジェクトが初期化されていません」という例外をキャッチできるかどうか誰かが知っていますか?AXで特定の例外をキャッチできない可能性があるという投稿を読みましたが、そうではないことを願っています(参照:https ://community.dynamics.com/product/ax/f/33/p/ 16352 / 23700.aspx#23700)。
コード例: 問題を再現する単純なコードを次に示します。
server static void main(Args args)
{
Array arr;
;
info ("debug: before try...catch");
try
{
// ttsbegin; // enable/disable to test with transactions
// arr = new Array(Types::String); // Enabling this line will prevent the exception
arr.exists(3);
// ttscommit; // enable/disable to test with transactions
}
catch (Exception::Internal) // This exception handler was the Magic Sauce!!
{
info ("debug: catch (Exception::Internal)");
}
catch (Exception::Error)
{
info ("debug: catch (Exception::Error)");
}
catch
{
info ("debug: catch");
}
info ("debug: after try...catch");
}
UPDATE 2013-01-29 この質問がもっと見られるまで、私は答えを受け入れるのを待っています。これまでの回答ありがとうございます。
私が挙げた例は単純なものでした。このタイプのバグは、既知の場合は簡単に修正できます。そして、防御的なプログラミングは常に良い考えです。
ただし、現実の世界では、バグが発生したコードは非常に複雑でした。エラーは、サブクラスのオーバーロードされたメソッドの数レベルの深さで発生しました。これは、特定のシナリオで、オーバーロードされたメソッドがスーパークラスのメンバー変数の保護された値を破損したときに発生しました。ここでバグがコードで発生しましたが、スーパークラスがメンバー変数を再度使用しようとするまでバグは現れませんでした。バグが検出され、追跡されたときに、バグは簡単に修正されました。
防御的に、はい、使用するたびにすべての保護されたメンバー変数をチェックできますが、それはパフォーマンス、コードの可読性、実用性などに影響を及ぼし始めます。そのため、言語は例外処理を提供します。
ここでの問題は、これらのタイプのバグをどのようにキャッチして、コードをより堅牢で防弾にすることができるかということです。ほとんどの開発環境(C、C ++、C#、Javaなど)では、トップレベルのtry ... catchを使用して、予期しないすべての例外をキャッチ、ログ記録、およびクリーンアップできます。したがって、コードは他の無関係なタスクで処理を続行できます。このバグが発生してもシステム全体が完全に停止することはないため、AXはある程度継続しています。ただし、AX / X ++に欠陥があると思われるため、このジョブのキャッチ後のコードは実行されていません。
「オブジェクトが初期化されていません」という例外(実際にはすべての例外)をキャッチして処理を続行するための革新的なソリューションまたは回避策が存在する場合は、それを探しています。