例外原因/消息。我在这里重新发明了轮子吗?

时间:2017-06-26 10:06:37

标签: axapta dynamics-ax-2012 x++

我想要某种机制来获取有关捕获的异常的更多信息。 (特别是我抛弃自己中止交易的例外情况)我环顾四周,几乎我唯一能找到的就是"使用信息日志"。这对我来说似乎不是一个好主意。首先,访问和查找最后一条消息很麻烦。而且它的大小有限,因此在某些时候新消息甚至不会出现。

所以我的想法如下:创建一个类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的这个缺点吗?

1 个答案:

答案 0 :(得分:2)

简答:是的。

虽然你的“精彩”计划“有效”,但它很快就会变得无聊,因为你现在必须将你的NuException对象从听众(job)向下深入20级传递给投掷者({ {1}})。您的foo方法和其他中间人对您的例外计划没有兴趣或知识,但无论如何都必须通过它 更新后不再是这种情况。

有几种方法可以去。

  1. 使用observer pattern之类的Event broker或AX 2012及更新的使用delegates

  2. 坚持bar系统,并使用InfoAction课程将您的信息包装好以后再使用。它可用于显示堆栈跟踪或其他有趣的信息。

  3. 使用专用表进行记录。

  4. 第三种方式似乎不切实际,因为任何错误都会撤消日志中的插入。这是默认行为,但可以规避。

    infolog

    你要走的路取决于你没有提到的情况。