web-dev-qa-db-ja.com

例外をスローするためのifステートメント?

こんにちは私はそれが例外の使用を所有するかどうかわからないので私は尋ねたかった:

public int Method(int a, int b) {
   if(a<b) throw new ArgumentException("the first argument cannot be less than the second");
   //do stuff... 
}

ifステートメントの後に例外をスローできますか?それとも例外を使ってキャッチするのですか?

22
TrN

それは完全に有効です。それがまさに例外の使用目的であり、ロジックの「例外」をチェックするために、想定されていなかったものです。

例外をキャッチする背後にある考え方は、データをどこかに渡し、それを処理するとき、結果が有効かどうか、つまり、キャッチしたいときが常にわからない場合があるということです。

あなたのメソッドに関しては、Methodの内部でキャッチしたくはありませんが、呼び出すときはそのままです。以下に例を示します。

try
{
    var a = 10;
    var b = 100;
    var result = Method(a, b);
}
catch(ArgumentException ex) 
{
    // Report this back to the user interface in a Nice way 
}

上記の場合、aはbよりも小さいので、ここで例外が発生する場合を除き、それに応じて処理できます。

25
Filip Ekberg

この場合、例外をキャッチする必要はありません。あなたはそれを投げて、彼らがあなたのメソッドを呼び出す方法に間違いを犯したことを呼び出し元に警告しています。自分でキャッチすると、それが起こらないようになります。はい、コードは正常に見えます。

10
dlev

まったく問題ありません。あなたはthrowing例外であり、それをキャッチ/処理しないので、try/catchブロックは必要ありません。

8
T.J. Crowder

constructorsを使用しても同じ構成を使用できます。しかし、あなたがすることすべきではない

   public int Method(int a, int b)
    {
        try
        {
            if (a < b)
                throw new ArgumentException("the first argument cannot be less than the second");
        }
        catch (Exception)
        {

        }
        return 0;

    }
6
crypted

あなたは正しい考えを持っています。次のようなコードを使用できます。

void MyMainMethod()
{

    // ... oh, let's call my Method with some arguments
    // I'm not sure if it'll work, so best to wrap it in a try catch

    try
    {
        Method(-100, 500);
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine(ex.Message);
    }

}


public int Method(int a, int b)
{
    if (a < b) throw new ArgumentException("the first argument cannot be less than the second");

    //do stuff ...  and return 

}

MSDNの例外の処理とスロー例外の処理のベストプラクティス を確認すると役立つ場合があります。

3
Mark Staff

ここで行ったことは完全にOKです。

引数チェックの一般的なパターンは、チェック/スローコードを静的な「契約」クラスにラップして、入力引数を検証するときに例外管理に一貫したアプローチが取れるようにすることです。

トピックから少し外れていますが、.NET 4.0を使用している場合は、メソッドの入力と出力の検証のために新しい Code Contracts 機能を確認することもできます。

1
Darren Lewis