异常 reason/message。我在这里重新发明轮子吗?
Exception reason/message. Am I reinventing the wheel here?
我想要某种机制来获得有关捕获的异常的更多信息。 (特别是我自己放弃交易的例外情况)我环顾四周,几乎唯一能找到的东西是 "Use the info log"。这对我来说似乎不是一个好主意。首先,访问和查找最后一条消息很麻烦。而且它的大小有限,所以在某些时候甚至不会显示新消息。
所以我的想法如下:创建一个 class NuException 并 通过所有方法传递它的实例 将实例存储在 class 中工作方法位于。当我需要抛出异常时,我会调用一个类似于 Global::error()
的方法,但这个方法需要一个标识符和一条消息。
一旦我到达我的 catch 块,我就可以从 我的对象 访问那些 class ,其中包含类似于 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 中的这个缺点吗?
简答:是。
虽然您的 "brilliant" 方案 "works" 很快就会变得无聊,因为您现在必须将 NuException
对象从侦听器向下传输 20 级(job
) 给投掷者 (foo
)。您的 bar
方法和其他中间人对您的异常方案不感兴趣或不了解,但无论如何都必须传递它。
更新后不再是这种情况
有几种方法。
使用 observer pattern like the Event broker or in AX 2012 and newer use delegates.
坚持使用 infolog
系统,然后使用 InfoAction class 将您的信息打包以供日后使用。它可用于显示堆栈跟踪或其他有趣的信息。
使用专用的 table 进行日志记录。
第三种方法似乎不切实际,因为任何错误都会撤消日志中的插入。这是默认行为,但可以规避。
MyLogTable log;
Connection con = new UserConnection();
con.ttsBegin();
log.setConnection(con);
... // Set your fields
log.insert();
con.ttsCommit();
你要走的路取决于你没有提到的情况。
我想要某种机制来获得有关捕获的异常的更多信息。 (特别是我自己放弃交易的例外情况)我环顾四周,几乎唯一能找到的东西是 "Use the info log"。这对我来说似乎不是一个好主意。首先,访问和查找最后一条消息很麻烦。而且它的大小有限,所以在某些时候甚至不会显示新消息。
所以我的想法如下:创建一个 class NuException 并 通过所有方法传递它的实例 将实例存储在 class 中工作方法位于。当我需要抛出异常时,我会调用一个类似于 Global::error()
的方法,但这个方法需要一个标识符和一条消息。
一旦我到达我的 catch 块,我就可以从 我的对象 访问那些 class ,其中包含类似于 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 中的这个缺点吗?
简答:是。
虽然您的 "brilliant" 方案 "works" 很快就会变得无聊,因为您现在必须将 NuException
对象从侦听器向下传输 20 级(job
) 给投掷者 (foo
)。您的 bar
方法和其他中间人对您的异常方案不感兴趣或不了解,但无论如何都必须传递它。
更新后不再是这种情况
有几种方法。
使用 observer pattern like the Event broker or in AX 2012 and newer use delegates.
坚持使用
infolog
系统,然后使用 InfoAction class 将您的信息打包以供日后使用。它可用于显示堆栈跟踪或其他有趣的信息。使用专用的 table 进行日志记录。
第三种方法似乎不切实际,因为任何错误都会撤消日志中的插入。这是默认行为,但可以规避。
MyLogTable log;
Connection con = new UserConnection();
con.ttsBegin();
log.setConnection(con);
... // Set your fields
log.insert();
con.ttsCommit();
你要走的路取决于你没有提到的情况。