2013-04-13 10 views
19

私は自分のExceptionクラスをC#で実装しようとしています。この目的のために、Exceptionから派生したCustomExceptionクラスを作成しました。カスタム例外を返す

class CustomException : Exception 
{ 
    public CustomException() 
     : base() { } 

    public CustomException(string message) 
     : base(message) { } 

    public CustomException(string format, params object[] args) 
     : base(string.Format(format, args)) { } 

    public CustomException(string message, Exception innerException) 
     : base(message, innerException) { } 

    public CustomException(string format, Exception innerException, params object[] args) 
     : base(string.Format(format, args), innerException) { } 
} 

は、その後、私はそれを

static void Main(string[] args) 
{ 
    try 
    { 
     var zero = 0; 
     var s = 2/zero; 
    } 
    catch (CustomException ex) 
    { 
     Console.Write("Exception"); 
     Console.ReadKey(); 
    } 
} 

を使用し、私は私が私の例外が発生します期待していますが、私が得るすべては標準DivideByZeroExceptionです。私はどのように私のCustomExceptionクラスを使用して0除算例外をキャッチできますか?ありがとう。

+10

なぜ.NETあなたの例外の使用を開始する必要がありますか?あなたは['スローする](http://msdn.microsoft.com/en-us/library/1ah5wsex(v = vs.110).aspx)それを自分で行う必要があります。 –

+0

いいえ、私がそれを取得しないセクションをキャッチするために新しい例外をスローして追加する場合でも。私はstandart例外を取得し続けます。 DevideByZero例外をキャッチするために私のCustomExceptionにいくつかのコードを記述する必要がありますか? – JohnyMotorhead

+0

divより前にゼロをスローしたり、アレクセイのアプローチを使用したりするべきではありません。ところで、私はあなたに非常に良い理由がない限り、例外を置き換えることは良い習慣ではないと思います。 –

答えて

26

既存のコードによってスローされた例外の種類を魔法のように変更することはできません。あなたのコードのどこかでそれをthrowする必要があり、あなたがあなた自身の例外を確認したい場合は、すべての

try 
{ 
    try 
    { 
     var zero = 0; 
     var s = 2/zero; 
    } 
    catch (DivideByZeroException ex) 
    { 
     // catch and convert exception 
     throw new CustomException("Divide by Zero!!!!"); 
    } 
} 
catch (CustomException ex) 
{ 
    Console.Write("Exception"); 
    Console.ReadKey(); 
} 
+15

これを行うのは恐ろしいことだと言いたいかもしれません。 – Wilbert

+2

@Wilbertどの部分? '2/zero'はおそらく非常に特殊な例外('((string)(null))を取得する最も簡単な方法です。長さ 'はもっと明らかに"サンプルコード - コピーしないでください ");他の多くの例外( 'IOException'、' KeyNotFoundException'など)が 'CustomerNotFoundException'として再スローされる可能性があり、その例外に設定されたInnerExceptionが原因で、いくつかの高レベル操作が失敗すると、おそらくセキュリティ要件のためではない)。うまくいけば、入れ子になった 'try' /' catch'は単なるサンプルにすぎないことは明らかです。 –

+0

ええ、その文脈では意味がありますが、ちょうどコードサンプルです..よく:) – Wilbert

16

まず:

は、あなたはそれをキャッチできるようにあなたの例外をthrowする必要が

public static int DivideBy(this int x, int y) 
{ 
    if (y == 0) 
    { 
     throw new CustomException("divide by zero"); 
    } 

    return x/y; 

} 

その後:

int a = 5; 
int b = 0; 
try 
{ 
     a.DivideBy(b); 
} 
catch(CustomException) 
{ 
//.... 
}