ここから本文です

エラー処理では、IF文は原則として使わないものなのでしょうか?

krk********さん

2013/4/313:48:39

エラー処理では、IF文は原則として使わないものなのでしょうか?

if ((System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text.ToString(),@"^\d.+$")))
{
test.setNum(int.Parse(TextBox1.Text.ToString()));
Label1.Text = test.getNum();
} else {
Label1.Text = "エラー:数字を入力してください。";
}

というコードを書いてみたところ
次のように改めよと指導されました

try
{
test.setNum(int.Parse(TextBox1.Text.ToString()));
Label1.Text = test.getNum();
} catch {
Label1.Text = "エラー:数字を入力してください。";
}

確かにコード的にはtry文のほうがスマートですが
if文のほうは、推奨されないのでしょうか?

補足ご指摘ありがとうございます
確かに「.」は不要ですね、typoだとは思うのですが、見逃していました

私もint.Parseの挙動には疑問を覚えますし
そもそも答えが二択しかないのに、こんな意図的に例外を出させる処理を書いていいのかどうかも悩みます
(数字だけか、そうでないかの他に例外があるとは思えない)

閲覧数:
2,255
回答数:
4

違反報告

ベストアンサーに選ばれた回答

har********さん

2013/4/411:01:39

◇エラー処理では、IF文は原則として使わないものなのでしょうか?
例外処理ではIF文は使いません。
エラーチェックにはIF文を使います。
ここに上げられている例はユーザ入力のエラーチェックなので、入力を受付け可能か(事前条件が満たされているか)をIF文でチェックすれば良いと思います。

たしかに教科書的にはtry~catchですし、例外処理を教育の場で教えるときにはこのような例題が使われるのを見かけます。
それをそのまま教えているインストラクタも多いと思います。
そういう教育が、日本のプログラミング技術の水準を下げているのですが。
(盲目的にtry~catchを推奨するreininnjpさんが大量生産されることになるわけで)

「例外は例外的な場合にだけ使う」というのは、某有名テキストにも紹介されている基本方針ですが、実務でも同じです。
無駄なtryブロックは、Javaコンパイラの最適化機能を邪魔するだけで、何のメリットもありません。
例外的な場合というのは、たとえばIF文でチェックしても仕方のない実行時のエラー、たとえばプログラムが動作しているコンピュータの外の世界に起因するエラーです。

ファイルやネットワークからの入力は、まさに入力中に障害が発生するかもしれないのですから、IF文で(事前に)チェックしても無駄です。
そういう時の障害回復処理に、Javaの例外処理機構は大きな力を発揮します。

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

nic********さん

2013/4/321:18:11

そもそもその2文、意味が違うように見えるんだが。正規表現を見る限り、数字でない物が含まれていても通るケースがある。で、前者には問題があり、if文の条件が成立したとしても、例外が飛ばないという保証がない。

個人的には「普通に発生しうる問題に例外を使うべきではない」派なのだが、その例のように記述量に圧倒的な差がある場合は妥協して例外を使う。
ま、どっちでもいいのではないだろうか。ロジックとビューが分離できていないそんなコードを提示するようではいずれにせよその職場は糞だ。

wat********さん

編集あり2013/4/323:16:01

ifかtryかの問題というより,Int.Parseが絶対に成功するような正規表現であるか,Int.Parseなら簡単かもしれないけど他の入力項目も同様の処理を書いた場合には読みやすいコードになるか…といったことが気になります。
また,例外を吐く可能性のある処理についてはtry〜catchをしてやらないと文句を言われることもあります。いくら事前にそういう状況を「意味的に」排除したとしても。

追記:nicolish_nicolishさんの回答を読んで見なおしたけど,\dのあとの.っておかしいですね?

アバター

ID非公開さん

編集あり2013/4/313:55:04

はい、出来れば try catch を使うべきです。
圧倒的に分かりやすい読みやすいプログラムになるからです。
そもそも、昔は try catch が無くてエラー処理の記述が大変でしたが、
try catch が、発明されてからは、飛躍的に楽になりました。
発明される以前は、ご指摘のようなif文などで頑張って作っていました。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる