我想要某种机制来获取有关捕获的异常的更多信息。 (特别是我抛弃自己中止交易的例外情况)我环顾四周,几乎我唯一能找到的就是“使用信息日志”。这对我来说似乎不是一个好主意。首先,访问和查找最后一条消息很麻烦。它的大小有限,所以在某些时候新消息甚至都不会显示出来。
所以我的想法如下:创建一个类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的这个缺点吗?
简短回答:是的。
虽然你的“辉煌”计划“有效”,但它很快就会变得无聊,因为你现在必须将你的NuException
物体从听众(job
)深处向下移动到投掷者(foo
)。您的bar
方法和其他中间人对您的例外计划没有兴趣或知识,但无论如何必须通过它。
更新后不再是这种情况。
有几种方法可以去。
infolog
系统并使用InfoAction类将peggy包装成您以后要使用的信息。它可用于显示堆栈跟踪或其他有趣信息。第三种方式似乎不切实际,因为任何错误都会撤消日志中的插入。这是默认行为,但可以规避。
MyLogTable log;
Connection con = new UserConnection();
con.ttsBegin();
log.setConnection(con);
... // Set your fields
log.insert();
con.ttsCommit();
你的出行方式取决于你没有提到的情况。