digraph g { before [label = "", style=invis, width =0.001, height = 0.001]; t [label = "try"]; f [label = f()>]; er [label = "error return"]; nr [label = "normal return"]; o [label = "x = x_out"]; o1 [label = "x = x_out"]; o2 [label = "x = x_out"]; o3 [label = "x = x_out"]; c1 [label = "catch (ExceptionA e)"] c2 [label = "catch (ExceptionB e)"] c3 [label = "catch (Exception e)"] l1 [label = "log(\"Type A\")"]; l2 [label = "log(\"Type B\")"]; l3 [label = "log(\"Exception\")"]; after [label = "next"]; after2 [label = "", style= invis, height = 0.0001, width = 0.0001] before -> t -> f -> er -> {c1, c2, c3}; f -> nr -> o -> after; c1 -> o1 -> l1; c2 -> o2 -> l2; c3 -> o3 -> l3; {t nr c1 c2 c3} -> after [style = dashed, constraint = false]; {l1 l2 l3} -> after -> after2; BEFORE [label = "", style = invis, width = 0.001, height = 0.001]; T [label = "try"]; F [label = "f()"]; X_IN [label = "x_in = x"]; X_OUT_NORMAL [label = "x = x_out"]; X_OUT_1 [label = "x = x_out"]; X_OUT_2 [label = "x = x_out"]; X_OUT_3 [label = "x = x_out"]; NORMAL_RET [label = "normal return"]; ERROR_RET [label = "error return"]; C1 [label = "catch (ExceptionA e)"] C2 [label = "catch (ExceptionB e)"] C3 [label = "catch (Exception e)"] L1 [label = "log(\"Type A\")"]; L2 [label = "log(\"Type B\")"]; L3 [label = "log(\"Exception\")"]; NEXT [label = "next"]; BEFORE -> NEXT; BEFORE -> T -> F -> {X_IN NORMAL_RET ERROR_RET} NORMAL_RET -> X_OUT_NORMAL ERROR_RET -> {C1 C2 C3} C1 -> {X_OUT_1 L1} C2 -> {X_OUT_2 L2} C3 -> {X_OUT_3 L3} }