ステートマシンのTransition(s)への引数の引き渡し

前提
ステートマシンのEntryにtry catchを入れており、そのtry catch内でワークフロー呼び出しを行っています。

やりたいこと
この呼び出されたワークフロー(Process.xaml)内で例外が発生した場合にステートマシンのTransitionの「ビジネス例外」もしくは「システム例外」に行くのですが、この例外処理の中で呼び出されたワークフロー内で使用した変数の値を使用したいです。

試したこと
1.Process.xaml内で、引き渡したい変数を引数「out_コード/出力方向」へ代入
2.Invoke Workflowの引数をインポートで、出力方向のout_コードに変数「エラーコード」
を設定
※変数「エラーコード」のスコープ範囲に問題はありません。
3.「ビジネス例外」のAction内で②のエラーコードを使用

起きている問題
上記、①の時点ではout_コードへきちんと値が代入されていますが、③の時、エラーコードの中身が空になってしまいます。

どこを直す必要がありますでしょうか?

こんにちは

例えば以下が参考になると思います。

いずれにしましても、呼び出し先の中でも例外を捕捉(try-catch)する必要があると思います。
(任意の値をセットしてからthrowするか、正常終了の形にして引数を渡すか)

この部分について具体的にご教示いただきたいです。
現状の、Try Catch内にInvoke Workflowを置くのと、InvokeWorkflowのワークフロー内にTry Catchを追加するのとで、どのような違いがあるのでしょうか?

こんにちは

呼び出し先の内部で例外が発生して、呼び出し元で例外を捕捉する場合、
引数の出力は基本的には反映されません。(仕様と思います)

そのため呼び出し先の内部で例外を捕捉して、呼び出し元に情報を渡してあげる
工夫をするということになります。

その一つが上記のリンク先にある、exceptionの中に情報を与えてrethrowする方法です。
この方法はexceptionクラスを通じて情報の伝達ができます。これを呼び出し元のtry-catchで
捕捉します。

別の方法として、呼び出し先の内部で例外を捕捉、出力用の変数の値をセットして
例外処理は終了し、そのまま呼び出し先のワークフローを正常に抜ける方法です。
呼び出し元は、その出力の有無で例外発生の有無を判断できますので、
これで判断すればよいかと思います。

tryCatchの配置について理解致しました。ありがとうございます。

呼び出し先ワークフローに配置したCatchに
代入:exception.Data("errorCode") = row("コード").ToString

呼び出し元の例外処理のActionに
一行を書き込み:SystemException.Data("errorCode").ToString

と記述した上で、呼び出し先のワークフロー内で意図的にエラーを出してみたところ、
Actionの一行を書き込みで「オブジェクト参照がオブジェクトインスタンスに設定されていません」
とのエラーが出力されました。

試しに、

代入:exception.Data("errorCode") = row("コード").ToString

この部分の右辺を"100"と文字列にしてみたところ、出力されるのを確認しました。
右辺に現在のrowデータを格納する方法はありませんか?

すみません。上記の問題は変数の代入を挟むことで解決致しました。

exception.Data(“errorCode”)へ代入した値を、同ワークフロー内で次の繰り返しの際に条件分岐に使用したいです。

例外処理を実行したデータかどうかを判断するために、ワークフロー呼び出し元の例外処理のActionで代入等を行い、呼び出し先で代入された値を取得することで実現できないかと思っております。

フローの大まかな流れは、

Try Catch
 Try
  ワークフロー呼び出し
    Try Catch(呼び出し先内に配置)
     Try
     代入:エラーコード = row("コード").ToString
     Catch
     代入:exception.Data("errorCode") = エラーコード
     再スロー
 Catch
  エラーリストへSystemException.Data("errorCode").ToString を書き込み
  ★ここまで到達したデータを呼び出し先内のTryへ引き継ぎたい

エラーリストに出力された内容を見にいく方法は、以下の理由により避けております。
・実務担当者がエラーリストに出力された内容を手入力で作業を実施
・次回実行時にも同じコードを扱うため、前回のエラー分なのか今回のエラー分なのか判断できない
・↑の時、手作業後に削除を依頼することはできるが人が介入するため確実なものではない

こんにちは

何が問題・課題なのかがわかりにくいのですが、このあたり可能なら具体的なワークフローや
スクリーンショットをつけていただいた方が良いかもしれません。

呼び出し元でエラーコードは取得できているという理解でよろしいでしょうか?
呼び出し元でその値を変数に代入すれば良い、という話でしょうか。

分かりづらくすみません。
端的にご質問いただきありがとうございます。

はい、できました。

呼び出し元でその値を変数に代入し、呼び出し先のワークフローに引き渡したいです。

仮にMain.xamlからSub.xamlを呼び出していると仮定して、
Sub.xaml内で例外が発生し、そのエラーコードを
呼び出し元のMain.xamlで取得しました。
これをSub.xamlに渡すということでしょうか?

処理がイメージしがたいのですが、Sub.xamlを2回呼んでいるということでしょうか?

例外処理でエラーリストへ出力などを行った後、再度頭から実行するようになっているため
Sub.xamlも同様に実行されます。
そのため、前回エラーになったコードをSub.xamlで取得したいということになります。

こんにちは

そうであれば、スコープが広めの変数(例えばMain.xamlの一番外側)を用意して、
それを引数としてSub.xamlに渡す。
例外処理の中で、その変数にエラーコードをセットすれば良いかと思います。

例外処理の中の変数は呼び出し先のワークフローに引き継ぎできるのですね。
呼び出し先のワークフローの変数は例外処理以内でクリアになってしまうためそれができないと思っていました。
ありがとうございます。

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.