質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

4回答

2649閲覧

ひたすら実行するプログラム

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2016/10/20 13:39

例外が発生しても途中から実行するようなプログラムってどう書けばよいのでしょうか?
どこまで実行したかをファイルかデータベースに保存しておくのでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

例外が発生しても途中から実行するようなプログラム

例外処理についてはすでに、他の回答者の方が回答されているので、
「例外が発生しても途中から実行する」こと自体について言います。


例外処理には優先順位があります。

  1. 開発段階では、そもそも例外が発生したら、終了させて原因を調べます。
  2. 正常系(普通)の処理で対応できるなら、なるべく正常系で対応します。
  3. たとえば、ゼロ除算や入力チェックなどは正常系の処理で対応できます。
  4. もし、例外処理でないと対応が難しいのであれば、例外処理で書きます。
  5. 例外処理をするにしても、強制終了させた方が良いなら終了させます。
  6. しかし、深夜のバッチ処理などは、止めると業務に支障をきたします。
  7. その場合には、自動的に回復させ、処理を継続するように書きます。

上記をまとめると、例外処理そのものはなるべく少ない方が良いが、
例外を出すべきときには出し、落とすべきときには落とす、のが原則です。

一方で、例外処理を便利なIF文、GOTO文の代わりとして使う、
または、エラーを無視して無理やり続ける仕組みとして使うのは、
邪道な例外処理です。現実にはよくありますが、理想ではありません。


設計思想の違いなどもあるので、考え方を押しつけはしませんが、
なぜそうすべきと考えるのかは、説明しておきましょう。

もし、「エラーで落ちるのが少ない方が良い」といって、
例外を握り潰して無理やり処理を継続すると、
障害発生時に原因が特定しにくくなります。

さらに、最悪ではデータベースの整合性が壊れてしまう場合も想定できます。
商業でもDBが壊れてサービスが終了した例が過去にありますね。

一般社会で言うと、小さな事故の報告を握りつぶした結果、
大事故につながってニュースになるケースと同じことです。
だから理想論としては、面倒くさくても止めて対応すべきです。

投稿2016/10/20 17:57

LLman

総合スコア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

kanohisa

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自動修復できるものはできるだけプログラムに書いておく。
どうしても手作業が必要なものは強制終了して手作業する。
どこでどういうふうにおかしいかを書いておけば手作業の助けになる。

いづれにしても、何百というプログラムが走る夜の作業で止まってしまっては
朝のオンラインが立ち上げられなくなるので、できるだけプログラムに書いておく必要がある。
プログラムって例外処理のオンパレードなんですよね。
やりたいことだけ書くならどれだけ早く書けるかって思いますね。

私が担当していたところは会社のものだったので、「ごめん、ちょっと待って」で済んだけど、
銀行なんかだったら新聞沙汰ですし一般客が離れていってしまっては始末書では足りませんから。

投稿2016/10/20 14:37

maiko0318

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1.例外が発生したデータをスキップして続行する場合
begin rescue endを使って例外の次から続行するようにする。

2.例外が発生した場合、一旦異常終了させて、原因データを修正して、再実行する場合
お書きのように、1データ処理毎、ないしいくつかのデータを処理毎に、状況をデータベースかファイルに保存しておく。
再実行時は、「再開である」という指示付きで実行して保存した状況を復元して処理再開する。

投稿2016/10/20 13:59

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問