如何防止 PlantUML 创建错误图像?

How prevent PlantUML from creating error images?

当 PlantUML 控制台工具在图表中遇到语法错误时,它会生成一个带有错误回溯的图像,如下所示:

有没有办法禁止生成错误图像并可能将回溯输出到 stderr 中?


我使用 PlantUML CLI 从多个源文件生成图像,如下所示:

$ plantuml diag1.puml diag2.puml diag3.puml

其中一些图表可能有语法错误,我需要跳过错误的部分。

我可以解析 stderr 并从那里得到错误的图表名称,但这是最后的手段。我相信上述行为应该有一个本地选项。

更新 07.07.2021

自 Plantuml 版本 1.2021.8 以来,有一个新选项 -noerror 正是这样做的:跳过错误图表并将有关错误的信息写入 stderr。

$ plantuml -noerror diag1.puml diag2.puml diag3.puml
Error line 5 in file: diag2.puml
Some diagram description contains errors

只生成了两张图片。

专业提示:Plantuml 有一个很棒的 forum,创建者可以在几天内迅速响应所有问题并将更改推送到新版本。


旧答案

普通模式下好像不行,-pipe模式下可以。搜索的参数是 -pipeNoStderr.

如果你运行 PlantUML 在控制台的管道模式下,你可以输入图表代码,在每个图表之后它会立即输出图像的二进制代码。您还可以在脚本中使用它在 stdin 中输入代码并在 stdout 中获取结果。


你应该 运行 plantuml 像这样:

$ plantuml -pipe -pipeNoStderr -pipedelimitor ___sep___

此处:

  • -pipe表示以管道模式启动plantuml。它将接受 stdin 中的图表代码,立即处理它并 return 以二进制格式生成 std​​out;
  • -pipeNoStderr 告诉 plantuml 不要渲染错误图像。相反,它将 return 文本格式的错误回溯;
  • -pipedelimitor 告诉 plantuml 如果您将多个图表源发送到管道中,则在图表之间添加分隔符。这样您就可以确定一张图片的结束位置和另一张图片的开始位置;
  • ___sep___ 是我选择的分隔符字符串,它可以是任何你喜欢的,但足够独特。

管道工作流迫使我完全重写生成图表的工具。 Python 中的具体示例超出了这个问题的范围,但一般步骤是:

  1. 收集您要渲染的所有图表源。
  2. 检查每个来源是否以 @startuml 开头并以 @enduml 结束(否则此类错误的来源可能会损坏相邻图表)。
  3. 将所有来源放入一个 string 变量中,用几个换行符分隔。
  4. 运行管道模式下的 Plantuml 子进程。
  5. 将组合的源字符串提供给它。
  6. 从 stdout 获取响应并用分隔符将其拆分(___sep___ 在我的例子中)
  7. 循环浏览结果列表并提醒用户有关以 ERROR 开头的元素,并以二进制格式保存不以
  8. 开头的元素。

This article 帮了大忙。它在 JavaScript 上有一个示例项目,可以异步解决问题(与我不同)。