例外が発生しても途中から実行するようなプログラムってどう書けばよいのでしょうか?
どこまで実行したかをファイルかデータベースに保存しておくのでしょうか
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
例外が発生しても途中から実行するようなプログラム
例外処理についてはすでに、他の回答者の方が回答されているので、
「例外が発生しても途中から実行する」こと自体について言います。
例外処理には優先順位があります。
- 開発段階では、そもそも例外が発生したら、終了させて原因を調べます。
- 正常系(普通)の処理で対応できるなら、なるべく正常系で対応します。
- たとえば、ゼロ除算や入力チェックなどは正常系の処理で対応できます。
- もし、例外処理でないと対応が難しいのであれば、例外処理で書きます。
- 例外処理をするにしても、強制終了させた方が良いなら終了させます。
- しかし、深夜のバッチ処理などは、止めると業務に支障をきたします。
- その場合には、自動的に回復させ、処理を継続するように書きます。
上記をまとめると、例外処理そのものはなるべく少ない方が良いが、
例外を出すべきときには出し、落とすべきときには落とす、のが原則です。
一方で、例外処理を便利なIF文、GOTO文の代わりとして使う、
または、エラーを無視して無理やり続ける仕組みとして使うのは、
邪道な例外処理です。現実にはよくありますが、理想ではありません。
設計思想の違いなどもあるので、考え方を押しつけはしませんが、
なぜそうすべきと考えるのかは、説明しておきましょう。
もし、「エラーで落ちるのが少ない方が良い」といって、
例外を握り潰して無理やり処理を継続すると、
障害発生時に原因が特定しにくくなります。
さらに、最悪ではデータベースの整合性が壊れてしまう場合も想定できます。
商業でもDBが壊れてサービスが終了した例が過去にありますね。
一般社会で言うと、小さな事故の報告を握りつぶした結果、
大事故につながってニュースになるケースと同じことです。
だから理想論としては、面倒くさくても止めて対応すべきです。
投稿2016/10/20 17:57
総合スコア5592
0
begin ~ rescue ~ endを使用します。
イメージとしてはこんな感じだと思います
ruby
1# num の値が10を超えるまで無限ループする処理 2 3num = 0; 4puts 'ループ開始' 5loop do 6 puts num 7 num += 1 8 9 # 例外が発生することを想定している処理をbegin ~ rescue ~ endで囲む 10 begin 11 12 # 10回に3回ぐらいランダムに例外を発生させてみる 13 raise '例外発生!' if rand(10) < 3 14 15 # 例外が発生したらrescueの中の処理を行い、処理を続行する 16 rescue => e 17 # ここでは例外例外メッセージを出力している 18 puts e.message 19 end 20 21 # num が 10より大きければループ終了 22 break if num > 10 23end 24puts 'ループ終了'
以下は↑の処理結果の例です
ループ開始 0 1 2 例外発生! 3 4 5 例外発生! 6 7 例外発生! 8 9 10 ループ終了
投稿2016/10/20 15:38
総合スコア32
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
自動修復できるものはできるだけプログラムに書いておく。
どうしても手作業が必要なものは強制終了して手作業する。
どこでどういうふうにおかしいかを書いておけば手作業の助けになる。
いづれにしても、何百というプログラムが走る夜の作業で止まってしまっては
朝のオンラインが立ち上げられなくなるので、できるだけプログラムに書いておく必要がある。
プログラムって例外処理のオンパレードなんですよね。
やりたいことだけ書くならどれだけ早く書けるかって思いますね。
私が担当していたところは会社のものだったので、「ごめん、ちょっと待って」で済んだけど、
銀行なんかだったら新聞沙汰ですし一般客が離れていってしまっては始末書では足りませんから。
投稿2016/10/20 14:37
総合スコア876
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。