- PR -

C# 自作関数の例外処理について

投稿者投稿内容
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2005-01-18 23:53
こんにちわ。プログラミングをはじめて間もないのですが自作関数の戻り値について
疑問があります。例えば文字を返す場合は失敗したらnull、実行するだけならboolで戻り値をfalseにしています。

public bool fnIsDate(object objDay)
{
try
{
string strDay = (string)objDay;
DateTime.Parse(strDay);
return true;
}
catch(Exception ER)
{
fnERLOG("fnIsDate",ER.Message);
return false;
}
}
とこんな感じにしているのですが、問題は戻り値がint型やDateTimeの場合は
例外なら何を返したらいいか?悩んでいます。
例えば誕生日とかなら答えが出なかったら-1とかありえない数値を戻せばいいけど
どの数値が戻ってきても、ありえる場合は例外の時は何を返せばいいか迷っています。
日付の場合も例外なら"0001/01/01"にしようかと思ったけど、そういう日付もあり得るかもしれないし。。いっそ例外無しでもいいのかなとも思うのですが、皆さんはどのようにしてらっしゃいますか?
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-01-18 23:55
諸農です。

引用:

とこんな感じにしているのですが、問題は戻り値がint型やDateTimeの場合は
例外なら何を返したらいいか?悩んでいます。



例外クラスをthrowします。
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-01-19 07:09
関数の呼び出し元にエラーを伝えるためには例外をThrowします。逆に言うと、呼び出された関数内で例外発生時にするべき処理が無いなら、必ずしもCatchする必要はありません。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-01-19 13:19
ども、ぼのぼのです。

例外はとても便利な仕組みですが、「例外をthrowしない関数」を作りたい場合もあります。そうゆうときは、出力値を参照渡しの引数にして、成功/失敗を表す戻り値と分けます。

更に付け加えると、私なら戻り値はboolでなくintにします。これはboolだと2種類の値しか返せないので、拡張性が無くなってしまうため。下記の例では空文字⇒0,正しい日付⇒1,不正な日付け⇒-1としています。

コード:
private int FmtDate(string strIn, ref string strOut)
{
    try {
        if(strIn.Length == 0) {
            strOut = "";
            return 0;
        }
        DateTime d = DateTime.Parse(strIn);
        strOut = d.ToString("yyyy/MM/dd");
        return 1;
    } catch {
        return -1;
    }
}


nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2005-01-19 14:15
こんにちは。ちょっと気になったので。。

引用:

更に付け加えると、私なら戻り値はboolでなくintにします。これはboolだと2種類の値しか返せないので、拡張性が無くなってしまうため。下記の例では空文字⇒0,正しい日付⇒1,不正な日付け⇒-1としています。



この考え方は例外処理が提供されている.NETプログラミングでは、デメリットにも繋がります。
結果コードによるエラー通知は、見逃し易く、後に結果コードを拡張したために、アプリケーションが予測不能な動作を行ってしまう可能性を秘めてしまうからです。
例外処理の利点は、例外を簡単に無視できないところにあります。
通常Windowsフォームアプリケーションであれば、例外がキャッチされないと、アプリケーションが落ちてしまいますが、エラーが発生しているにも関わらず、知らぬ顔をして動き続けるよりよっぽどましということです。(特にDB等のデータの整合性が問われるときなど)
また、アプリケーションが落ちないように.NETでは未処理の例外に対応することも可能なので(ThreadExceptionイベントやUnhandledExceptionイベント)、そのあたりを踏まえた上で、メソッドの定義やアプリケーション構造を設計したほうが、良いと思います。

jsさんに対しては、他の方と同様に例外をThrowですね
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-01-19 14:16
引用:

更に付け加えると、私なら戻り値はboolでなくintにします。これはboolだと2種類の値しか返せないので、拡張性が無くなってしまうため。下記の例では空文字⇒0,正しい日付⇒1,不正な日付け⇒-1としています。

だったら列挙型かなぁ
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-01-19 14:23
引用:

noderaさんの書き込み (2005-01-19 14:15) より:
この考え方は例外処理が提供されている.NETプログラミングでは、デメリットにも繋がります。
結果コードによるエラー通知は、見逃し易く、後に結果コードを拡張したために、アプリケーションが予測不能な動作を行ってしまう可能性を秘めてしまうからです。
例外処理の利点は、例外を簡単に無視できないところにあります。


ただ、何でも例外を投げればいいってわけでもないですよね。
今回のように「外部から入力した文字列を日付として解釈したい」という話であれば、
「入力した文字列が有効な日付ではない」というのは例外で捕捉するのではなく、事前に確認すべきだという気がします。本関数はその確認関数ですから、「正常な日付文字列ではない」という結果値を返すべきであって例外を発生させるべきではないような。
もちろん、この後の「文字列を日付に直す」ときには例外を発生すべきですけど。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-01-19 14:26
一応文献。
エラーの発生および処理のガイドライン

スキルアップ/キャリアアップ(JOB@IT)