2013-04-13 55 views
19

C# ile kendi Özel durumumu sınıfımı uygulamaya çalışıyorum. Bu amaçla, Özel Durumdan türetilmiş bir CustomException sınıfı oluşturdum. Özel bir özel durum döndürme

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) { } 
} 

O halde bunun

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

benim istisna alacak bekliyorum kullanın ama olsun bütün standart DivideByZeroException'ı olduğunu. CustomException sınıfımı kullanarak sıfır istisna ile nasıl bir bölünme yakalayabilirim? Teşekkürler.

+10

Neden NET istisna kullanmaya başlamalıdır? Kendiniz [atmak] zorundasınız (http://msdn.microsoft.com/en-us/library/1ah5wsex (v = vs.110) .aspx). –

+0

tamam, ben yeni bir throw atmak için ekleme bölüm eklese bile yakalayamayacağım bölüm. Standart istisna almaya devam edeceğim. DevideByZero istisnalarını yakalamak için CustomException'ımda bir kod yazmam gerekiyor mu? – JohnyMotorhead

+0

Eğer div'i _before_ sıfıra atarsanız ya da Alexei'nin yaklaşımını kullanırsanız yapmamalısınız. Bu arada: Çok iyi nedenleriniz olmadıkça istisnaları değiştirmek iyi bir uygulama değildir. –

cevap

26

Varolan kod tarafından atılan özel durum türünü sihirli olarak değiştiremezsiniz. kodunuzda yere throw gerektiğini, kendi istisna görmek istiyorsanız, her şeyden

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

Bunu yapmak için korkunç bir fikir olduğunu belirtmek isteyebilirsiniz. – Wilbert

+2

@Wilbert hangi kısımda? '2/sıfır', çok özel bir istisna almak için muhtemelen en kolay yoldur (' ((string) (null)). 'Length' daha açık görünebilir 'örnek kod - kopyalamayın'); Farklı istisnaların yeniden fırlatılması oldukça standart bir uygulamadır, çünkü birçok farklı istisnadan biri (IOException', 'KeyNotFoundException' ve benzeri, 'MüşteriNotFoundException' olarak yeniden atabilir, belki de InnerException bu istisnaya ayarlanmış olabilir veya belki güvenlik gereksinimleri nedeniyle); Umarım, 'try'/'catch' kelimesinin sadece bir örnek olduğu açıktır. –

+0

Evet, bu bağlamda mantıklı, ama sadece kod örneği .. iyi :) – Wilbert

16

İlk:

Bunu yakalamak edebilmek için istisna throw gerekir

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

    return x/y; 

} 

sonra:

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