java
1while (true) { 2 try { 3 func(arg1, arg2); 4 break; 5 catch (error e) { 6 // 解決したあとに、もう一度関数を叩いてほしい。 7 // 例外処理の内容は全て同じ。 8 // 何回か失敗する事もある。 9 continue; 10 } 11}
このfuncを包んでいる処理を他の関数でもやりたく、いい感じな書き方を知りたいです(その都度whileを書くのを避けたい)。
引数、戻り値は同じではなく、関数ごとに異なります。
フェーズのようなenumを作って、全体を包んでflagのような感じで、、みたいなのは思いつきましたが。。
java
1enum Phase { 2 FIRST, 3 SECOND, 4 THIRD; 5} 6 7var flag = Phase.FIRST; 8while (true) { 9 try { 10 if (flag == Phase.FIRST) { 11 func1(); 12 flag = Phase.SECOND; 13 } 14 if (flag == Phase.SECOND) { 15 func2(arg); 16 flag = Phase.THIRD; 17 } 18 19 // ... 20 21 break; 22 } catch (error e) { 23 // 処理 24 continue; 25 } 26}
pythonだったら以下のような解決策が思い浮かびます。
python
1def execute(func, *args, **kwargs): 2 while True: 3 try: 4 return func(*args, **kwargs) 5 except Exception: 6 # 解決する 7 input("enter") 8 continue 9 10def api(): 11 # 例外が発生する可能性がある処理 12 pass 13 14execute(api) 15execute(api2, arg1, arg2) 16# ...
これは関数自体を引数にすることができ、可変長引数が柔軟である必要があります。
どのように検索したら良いのか分からなく、皆様のお知恵を拝借したいです。
python でのコードを書いて頂いて、それを java でするにはどうしたら良いか? という感じにすると具体的で分かり易いと思うのですが、如何でしょうか。
Java標準の関数型インターフェイスは例外を投げられないので、自分で例外を投げる関数型インターフェースを定義するか、Optionalを使ってorElseGetで再試行するなどの方針が考えられます。再試行の無限ループも考えてみたいところです。
プログラムを具体化しなければなりません。jimbeさんのおっしゃるように pythonのコードを提示していただくのが近道かなと思います。
コメントありがとうございます。
pythonのコードを追加しました。
javaで実現するにはどうするかなのですが、調べてみて、javaで関数を引数に取るには引数、戻り値の型が同じである必要があるようです(引数、戻り値は関数ごとに違う)。
なので難しいですかね…
>再試行の無限ループも考えてみたいところです。
ここの例外は人が解決するので無限ループは考慮しなくて大丈夫です。
リミットなども設ける予定です。
回答2件
あなたの回答
tips
プレビュー