digraph G { subgraph a { enter [shape=rect]; exit [shape=rect]; enter -> try; try -> X -> f; f [label = y_in = y
f()>]; f -> { NR; catch; }; NR [label = x = x_out>]; catch [label = y = y_out>]; NR -> Y -> Z; catch -> "print(error)" -> Z -> "normal exit" -> exit; { edge [style = dashed, constraint = false]; try -> Z; catch -> Z; NR -> Z; } } subgraph b { method [label="Start", shape=rect]; t [label = "try"]; x [label = "X"]; x_in [label = "x_in = x", style = dashed]; y_in [label = "y_in = y", style = dashed]; call [label = "f()"]; nr [style=dashed, label = "normal return"]; data [style=dashed, label = "x = x_out"]; y [label = "Y"]; c [label = "catch"]; data_catch [style=dashed,label="y = y_out"]; print [label = "print(error)"]; z [label = "Z"]; ne [style=dashed, label = "normal exit"]; method -> {t z ne}; t -> {x call} call -> {x_in y_in nr c} nr -> {data y} c -> {data_catch print} } }