如果你在运行模型后看到过此错误消息 Mendix那么这篇文章适合你。

收到错误消息和多种消息变体的原因有很多。在这篇文章中,我将引导您了解如何找到这些错误的原因、如何修复一些较常见的错误以及如何在开发过程中最大限度地减少出错的可能性。
在整个帖子中,我还将使用示例。这些示例使用的应用程序有三个实体:Order、OrderLine 和 SaleOffer。在我们的应用程序中,我们可以将 OrderLines 添加到 Order,并且可以将 SaleOffer 附加到 Order。
寻找根本原因
一旦出现错误,您需要做的第一件事就是找出错误发生的位置。
如果您的应用在本地运行:
您只需打开 Business Modeler 并查看控制台即可。在控制台中,您将看到一个红色的行项目,开头有一个红色的“X”。此行将为我们提供所需的信息。

双击红线以获取有关错误消息和堆栈跟踪的更多详细信息。

此堆栈跟踪中包含三个关键信息:
- 微流名称和微流错误的位置:在此示例中,在独占拆分(网关)中的“IVK_DeleteOrderLine”中发现错误,标题为“Number > 0?”
- 发生的错误:在此示例中,错误与 java.lang.NullPointerException 有关。
- 失败的精确表达。在本例中,故障与排他性分割中导致空指针异常的部分有关。
如果您的应用程序在云中或从服务控制台运行
在这种情况下,您必须访问日志文件并查找以“ERROR”开头且时间戳与错误时间匹配的行。所有必要的详细信息均按顺序显示在日志中。

现在我们知道如何找到错误的位置,让我们看看两个常见的错误和一些有助于避免这些错误的模式。
空指针错误
当检索没有返回任何对象或对象上的属性为空时,就会发生空指针错误。在我的第一个示例中,Microflow 失败了,因为我们删除了 OrderLine,但检查发现该数字大于零。
我们看到了导致问题的排他性分裂(从之前的点(1)开始),并且由于我们现在知道了异常的潜在原因,因此我们可以开始解决问题。
修复空指针错误-选项1:
添加检查以查看 Number 属性是否为空或者 OrderLine 对象是否为空。
这些检查并非总是必要的——如果对象不可能为空,则没有理由检查它是否为空。请注意,“true”始终水平引导——这是最佳实践。
这些检查也可以在一次排他性分割中完成:
$订单行 != 空的
金益辉
$订单行/编号 != 空的
金益辉
$订单行/编号>0
从功能上讲,它们是相同的,但单独的拆分可以使微流更易于阅读和理解。请注意,这里的顺序很重要;您必须首先执行空检查,否则 $OrderLine/Number>0 的评估仍会导致空指针错误。
修复空指针错误-选项2:
如果实体的检索返回空,请尝试实施“GetCreate”模式。此模式通过使用微流操作而不是检索操作来实现。此示例显示了当我们想要更新订单上的 SaleOffer,但尚未将 SaleOffer 与订单关联时会发生什么。

在此实例中使用 GetCreate 模式。不要简单地检索 SaleOffer,而是调用保证返回 SaleOffer 的微流。下面的微流显示了此模式的工作原理。
Get Create 模式的第一步是尝试获取(检索)SaleOffer。尝试完成后,我们会检查是否成功。如果找到 SaleOffer,我们只需返回此 SaleOffer。如果检索失败,我们将创建一个新的 SaleOffer 并将其与订单关联。这样,下次调用此 Microflow 时,检索就会成功。最后,我们返回 NewSaleOffer。
仅当可以安全地创建对象的新实例时才应实现此模式。根据情况,这样做可能并不总是合适的。在这种情况下,您必须简单地执行空检查并相应地进行操作。
安全错误
安全性是任何域模型、微流和页面中的重要组成部分。但是,在启用安全性的情况下进行测试时,您可能会收到错误消息,其中包含“由于安全原因而失败”这句话。最常见的安全错误之一与实体访问有关。
应用实体访问权限 是微流属性中的一项设置。判断是否应用了实体访问的最快方法是检查微流的背景颜色。如果应用了实体访问,微流将会略微变色。

在上面的示例中,右侧显示的微流已应用实体访问。当应用实体访问时,实体上设置的安全性将优先于微流访问。
为了本例的目的,假设我们有两个用户角色,“用户”和“管理员”,以及两个模块角色,“用户”和“管理员”,其中“用户”被映射到“用户”模块角色,“管理员”具有类似的构造。
在调查安全错误时,我们遵循与之前相同的步骤 - 转到控制台查找红色突出显示的信息,这些信息将带我们找到导致错误的操作。例如,我们发现错误发生在这里:

我们看到此微流已应用实体访问权限(通过背景色调),因此我们知道必须检查实体和微流的安全性。具有用户角色“管理员”和实体 SaleOffer 上的以下安全设置的用户可以访问微流:

从这里可以确定问题所在——“管理员”试图在微流中创建 SaleOffer 实体,但没有权限这样做。有两种方法可以解决这个问题,但请记住,正确的解决方案将取决于具体的用例:
- 为“管理员”模块角色添加创建 SaleOffer 的权限
- 使“管理员”无法访问微流程
这些只是您可能遇到的几个运行时错误示例。还有其他您经常遇到的错误吗?有哪些错误比较难懂或令人困惑?