问题:
我有一些代码失败,因为对象尚未初始化。检测到此错误的解决方案很容易修复。然而,令我惊讶的是,我精心处理的异常处理并没有捕捉到这个异常。这意味着没有记录或处理异常,并且 try catch 块之后的代码从未执行过。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");
}
更新 2013-01-29 我正在等待接受答案,直到更多地查看此问题。谢谢你到目前为止的答案。
我知道我给出的例子很简单。这种类型的错误在已知时很容易修复。防御性编程总是一个好主意。
然而,在现实世界中,出现错误的代码非常复杂。该错误发生在子类的重载方法的几个层次。它发生在特定场景中,当重载方法破坏了超类中成员变量的受保护值时。这就是代码中出现错误的地方,但是,直到超类再次尝试使用成员变量,它才显现出来。该错误在被检测到并被追踪时被立即修复。
防御性地,是的,您可以在每次使用它时检查每个受保护的成员变量,但这确实开始影响性能、代码可读性、实用性等,这就是语言提供异常处理的原因。
这里的问题是如何捕获这些类型的错误以使代码更加健壮和防弹?在大多数开发环境(例如 C、C++、C# 或 Java)中,顶级的 try...catch 可用于捕获、记录和清理所有意外异常。因此代码将能够继续处理其他不相关的任务。AX 在某种程度上仍在继续,因为当这个错误发生时,整个系统并没有停止。但是,由于 AX/X++ 中的缺陷,此作业中 catch 之后的代码没有执行。
我正在寻找一种创新的解决方案或解决方法(如果存在)来捕获“对象未初始化”异常(实际上是所有异常)并继续处理。