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

问题描述 投票:2回答:1

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

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

axapta dynamics-ax-2012 x++
1个回答
2
投票

简短回答:是的。

虽然你的“辉煌”计划“有效”,但它很快就会变得无聊,因为你现在必须将你的NuException物体从听众(job)深处向下移动到投掷者(foo)。您的bar方法和其他中间人对您的例外计划没有兴趣或知识,但无论如何必须通过它。 更新后不再是这种情况。

有几种方法可以去。

  1. 使用像observer pattern或AX 2012中的Event broker和更新的delegates
  2. 坚持使用infolog系统并使用InfoAction类将peggy包装成您以后要使用的信息。它可用于显示堆栈跟踪或其他有趣信息。
  3. 使用专用表进行日志记录。

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

MyLogTable log;
Connection con = new UserConnection();
con.ttsBegin();
log.setConnection(con);
... // Set your fields
log.insert();
con.ttsCommit();

你的出行方式取决于你没有提到的情况。

© www.soinside.com 2019 - 2024. All rights reserved.