我想要某种机制来获取有关捕获的异常的更多信息。 (特别是我抛弃自己中止交易的例外情况)我环顾四周,几乎我唯一能找到的就是"使用信息日志"。这对我来说似乎不是一个好主意。首先,访问和查找最后一条消息很麻烦。而且它的大小有限,因此在某些时候新消息甚至不会出现。
所以我的想法如下:创建一个类NuException,通过所有方法传递一个实例在工作方法所在的类中存储一个实例。当我需要抛出异常时,我在其上调用类似于Global::error()
的方法,但是这个方法需要一个标识符和一条消息。
一旦我到达我的catch块,我可以从我的对象访问包含工作方法的类,类似于CLRExceptions的工作方式。
class NuException
{
"public" str identifier;
"public" str message;
public Exception error(str _id, str _msg)
{
//set fields
return Exception::Error;
}
}
class Worker
{
"public" NuException exception;
void foo()
{
throw this.exception.error("Foo", "Record Foo already exists");
}
void bar()
{
this.foo();
}
}
void Job()
{
Worker w = new Worker();
try
{
w.bar(ex);
}
catch (Exception::Error)
{
info(w.exception().message());
}
}
它有效,但有没有更好的方法?当然有人必须想出一个解决方案来解决AX的这个缺点吗?
答案 0 :(得分:2)
简答:是的。
虽然你的“精彩”计划“有效”,但它很快就会变得无聊,因为你现在必须将你的NuException
对象从听众(job
)向下深入20级传递给投掷者({ {1}})。您的foo
方法和其他中间人对您的例外计划没有兴趣或知识,但无论如何都必须通过它
更新后不再是这种情况。
有几种方法可以去。
使用observer pattern之类的Event broker或AX 2012及更新的使用delegates。
坚持bar
系统,并使用InfoAction课程将您的信息包装好以后再使用。它可用于显示堆栈跟踪或其他有趣的信息。
使用专用表进行记录。
第三种方式似乎不切实际,因为任何错误都会撤消日志中的插入。这是默认行为,但可以规避。
infolog
你要走的路取决于你没有提到的情况。