2010-12-09 8 views
7

Nesnemde dönüşüm kodum var tonlarca:C# 'daki istisnaları kullanırken çok sayıda küçük Try-Catch bloğunu nasıl birleştirebilirim?

 try 
    { 
     NativeObject.Property1= int.Parse(TextObject.Property1); 
    } 
    catch (Exception e) 
    { 
     Trace.WriteLineIf(ConverterSwitch.TraceVerbose, e); 
    } 
    try 
    { 
     NativeObject.Property2= DateTime.Parse(TextObject.Property2); 
    } 
    catch (Exception e) 
    { 
     Trace.WriteLineIf(ConverterSwitch.TraceVerbose, e); 
    } 

Ve böylece ... Tüm dönüşümlerin bazı özelliklerin başarısızlık sebebi olmasını istemiyorum, bu yüzden hepsini bir blokta arayamıyorum ama Bir şey başarısız olursa devam etmem gerekiyor ve devam et ..
Tüm bunları denemek için bir şeyler var mı?

Yazık ki C# kodunda yazamadık:

try 
{ 
    int num = int.Parse("3"); 
    decimal num2 = decimal.Parse("3.4"); 
} 
catch (Exception e) 
{ 
    Trace.Write(e); 
    continue; //continue execution from the point we left. (line 2) 
} 
+2

, sen –

+1

Somewhere VB6 :-) Next' On Error Resume 'kullanabilirsiniz/VBA geliştirici size gülüp edilir: Sonra bir şey gibi diyebiliriz. Asla "Bir dahaki sefere devam edersiniz" için birisinin çamunu duyduğumu düşünmemiştim. – JohnFx

+2

@Cody: Oh, God. Oh tanrım hayır. Lütfen hayır. – cdhowie

cevap

8

No ama şunları yapabilirsiniz:

private static void ExecuteAndCatchException(Action action) 
{ 
    try 
    { 
    action(); 
    } 
    catch (Exception e) 
    { 
    Trace.Write(e); 
    } 
} 

ve sonra

ExecuteAndCatchException(() => NativeObject.Property1 = int.Parse(TextObject.Property1)); 
ExecuteAndCatchException(() => NativeObject.Property2 = DateTime.Parse(TextObject.Property2)); 
+1

Bu aslında yazım hatalarından derlemeyecek bir utanç ...: P – cdhowie

+0

@cdhowie, oops, Derlemeyi denemedim, yazım hataları nerede? –

+0

@vc: 'Action();' - ayrıca, bu yöntem hiç kullanılmadığı için gerçekten de statik olmalıdır. – cdhowie

3

Böyle bir şey yapabileceğini :

Sonra

:

Attempt(() => NativeObject.Property1 = int.Parse(TextObject.Property1)); 
Attempt(() => NativeObject.Property2 = DateTime.Parse(TextObject.Property2)); 
1

sen VBS On Error + Resume Next benzer bir şey arıyorsanız gibi geliyor. C# böyle bir imkan yok. Düşünebildiğim en iyi sıkıştırma yöntemi, lambda ifadeleri ve yardımcı yöntemler kullanmaktır.

private void Wrap(Action del) { 
    try { 
    del(); 
    } catch (Exception e) { 
    Trace.WriteLineIf(ConverterSwitch.TraceVerbose, e); 
    } 
} 

Wrap(() => { NativeObject.Property1= int.Parse(TextObject.Property1); }); 
Wrap(() => { NativeObject.Property2= DateTime.Parse(TextObject.Property2); }); 
12

Varsa, TryParse yöntemlerini kullanabilirsiniz. Int32 değerini ayrıştırmak için aşağıdaki örnek kodlara bakın.

private static void TryToParse(string value) 
    { 
     int number; 
     bool result = Int32.TryParse(value, out number); 
     if (result) 
     { 
     Console.WriteLine("Converted '{0}' to {1}.", value, number);   
     } 
     else 
     { 
     if (value == null) value = ""; 
     Console.WriteLine("Attempted conversion of '{0}' failed.", value); 
     } 
    } 
+1

Evet, bu sorudan alınan örnek kodun, bu yuvalanmış Try-Catch blokları ile gerçekleştirmek istediğiniz şeyin kapsamını doğru bir şekilde gösterdiği varsayılarak, bu doğru yaklaşımdır. Bunları işlemeye çalışmak yerine, mümkün olduğunda istisnaları * önlemek her zaman daha iyidir. –

+1

İyi cevap! Geçici sorun hakkında bir soruya cevap vermek yerine gerçek sorunu çözmek için +1. – JohnFx

+0

+1 TryParse, ayrıştırma hatalarını görmezden gelmek için daha iyi bir yoldur. – juharr

0

Aşağıdaki gibi dönüştürme ve günlük kapsüller bir SafeConvert sınıfını yazabilirsiniz: Ben İstisna blok kısalma hakkında emin değilim iken

public static class SafeConvert{ 

    public static int ParseInt(string val) 
    { 
    int retval = default; 
    try 
    { 
     retval = int.Parse(val); 
    } 
    catch (Exception e) 
    { 
     Trace.WriteLineIf(ConverterSwitch.TraceVerbose, e); 
    } 
     return retval; 
} 

}

0

, ben fikir gibi teklif ettin. Eski VB'de Hata Devam Et Sonraki'ye benzer. Parse-ing yüklerken, mevcut olduğunda TryParse'i kullanma yoluna gidecektim. Eğer VB.NET geçerseniz

If(!DateTime.TryParse(TextObject.Property2, out NativeObject.Property2)) { 
    // Failed! 
}