1

次のようなメソッドを呼び出していたとします。これは、2 つの例外のうちの 1 つだけをスローすることがわかっています。

public static void ExceptionDemo(string input)
{
    if (input == null)
        throw new ArgumentNullException("input");

    if (input.Contains(","))
        throw new ArgumentException("input cannot contain the comma character");

    // ...
    // ... Some really impressive code here
    // ...
}

これを行うメソッドの実際の例は、Membership.GetUser (String)です。

メソッドを呼び出して例外を処理するには、次のうちどれを使用しますか。

方法 1 (最初に入力パラメーターを確認する)

public static void Example1(string input)
{
    // validate the input first and make sure that the exceptions could never occur
    // no [try/catch] required
    if (input != null && !input.Contains(","))
    {
        ExceptionDemo(input);
    }
    else
    {
        Console.WriteLine("input cannot be null or contain the comma character");
    }
}

方法 2 (呼び出しを try / catch でラップする)

public static void Example2(string input)
{
    // try catch block with no validation of the input
    try
    {
        ExceptionDemo(input);
    }
    catch (ArgumentNullException)
    {
        Console.WriteLine("input cannot be null");
    }
    catch (ArgumentException)
    {
        Console.WriteLine("input cannot contain the comma character");
    }
}

私は何年にもわたって両方の方法を教えてきましたが、このシナリオの一般的なベスト プラクティスは何かを考えました。

更新 いくつかの投稿者は、これらの例外が処理される方法ではなく、例外をスローするメソッドに焦点を合わせていたため、同じように動作する .Net Framework メソッドの例を提供しました ( Membership.GetUser (String) )。私の質問を明確にするために、あなたが呼び出している場合Membership.GetUser(input)、可能性のある例外、方法1、2、またはその他をどのように処理しますか?

ありがとう

4

4 に答える 4

0

以下のように、標準および一般的な構造をお勧めします。

public static void Operation(object input)
{
    try
    {
        ValidateInput(input);
        //Do Operation
    }
    catch (MySpecificException subSubExceptionType) //Catch most specific exceptions
    {

        //Log or process exception
        throw;
    }
    catch (MySpecificException subExceptionType) //Catch specific exception
    {
        //Log or process exception
    }
    catch (Exception exceptionType) //Catch most generic exception
    {

        //Log or process exception
    }
    finally
    {
        //Release the resources
    }
}

private static void ValidateInput(object input)
{
    if(input == null)
        throw new NoNullAllowedException();
    //Check if properties of input are as expected. If not as expected then throw specific exception with specific message
}
于 2013-10-04T10:41:14.413 に答える