2010-11-01 16 views
7

Düşünüyorum, "geçersiz kılma" ya da belki standart winforms .net İstisna formu yerine mümkün mü?Standart istisna/hata formunun değiştirilmesi .net

Ben bu adamdan bahsediyorum: o delik programı kapsamında esnasında, olası

alt text

mi, bu pencere geçersiz kılmak? Denemek/yakalamak zorunda kalmadan otomatik olarak demek istiyorum.

Teşekkür ederiz!

Daniel

cevap

0

Web formlarında Application_Error'ı global.asax dosyasında kullanabilirsiniz. Ama görünüşe göre winformlardan bahsediyorsun. Bu durumda:
deneyin ana marş yönteme aşağıdaki kodu ekleyerek:

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ExceptionHandler.OnThreadException); 

Ve şöyle ExceptionHandler sınıfını tanımlar: http://www.eggheadcafe.com/community/aspnet/2/27469/any-method-for-handling-error-globally-in-c.aspx

2

Sen işlemesi gerektiğini:

/// <summary> 
/// Main thread error handler. 
/// </summary> 
public sealed class ExceptionHandler 
{ 
    private ExceptionHandler() 
    {} 

    /// <summary> 
    /// Handles an exception on the main thread. 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="t"></param> 
    public static void OnThreadException(object sender, ThreadExceptionEventArgs t) 
    { 
     DialogResult result = DialogResult.Cancel; 
     try 
     { 
      result = ShowThreadExceptionDialog(t.Exception); 
     } 
     catch 
     { 
      try 
      { 
       MessageBox.Show("Fatal Error", "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); 
      } 
      finally 
      { 
       Application.Exit(); 
      } 
     } 

     // Exits the program when the user clicks Abort. 
     if (result == DialogResult.Abort) 
      Application.Exit(); 
    } 

    // Creates the error message and displays it. 
    private static DialogResult ShowThreadExceptionDialog(Exception e) 
    { 
     string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n"; 
     errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace; 
     return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop); 
    } 
} 

alınan Her ikisi de aşağıdaki olayları içerir:

Bu işleyicilerde, yaptığınız özel bir formu görüntüleyebilirsiniz.

2

Bu, ThreadExceptionDialog sınıfıdır, Form sınıfından türetilmiştir. Diyaloğu değiştirmek için ondan türetilmiş bir sebeptir, gömülü kontrollere kolayca erişemezsiniz. Kendi diyaloğunuzu kendi diyaloğunuzu da oluşturmak için kendi türetilmiş sınıfınızı oluşturabilir, sadece bir istisna argümanını alan bir kurucu verebilirsiniz. Bunu görüntülemek için Application.ThreadException için bir olay işleyicisi uygulayın.

İletişim kutusundaki temel kusuru dikkate alın. Diyaloğu kapatmak için kullanıcının bir düğmeyi tıkladığında doğru seçimi yapmasını bekler. Genel olarak, tam olarak neyin yanlış gittiği hakkında oldukça belirsiz bilgiler. Bu size bir şey ifade ediyor, nadiren kullanıcı için 'ah bok' olmaktan başka bir şey değil. Devam düğmesine tıklamak genellikle doğru olan şey değildir.

Kullanıcının bu kadar zor bir seçim yapmasını önlemek için, Mainrow() yönteminizdeki Application.SetUnhandledExceptionMode() yöntemini çağırın, olayın hiçbir zaman yükseltilmemesi için ThrowException komutunu iletin. Her işlenmemiş özel durum şimdi AppDomain.UnhandledException üzerinden geçer. Bir çalışan iş parçacığında yükseltilenler de dahil olmak üzere, numaralı iletişim kutusunun oluşturduğu istisnalar. Bunun için bir olay işleyici yazın ve e.ExceptionObject.ToString() değerini görüntüleyin ve/veya oturum açın. Bu bilgiyi masanıza veya kullanıcının BT personeline götürmek için bir yol bulmak size kalmıştır, böylece ürününüzü geliştirebilir ve makinelerini istikrarlı hale getirebilirsiniz.

0

this bağlantısını kontrol edin.sayfadan

:

Giriş Önce .NET onun geliştirilmiş durum işleme işlevselliği oldu öğrenme başladığında beni etkiledi şeylerden

biri. Bununla, atılan özel durumun türüne, tam yığın izlemeye ve iç özel durumlara kolay erişim gibi özellikleri kastediyorum. Bu, en üst düzey bir System.Exception yakaladığınız yerlerde hala tam bilgi almayı kolaylaştırır. Bu özelliği, belirli bir özel durum türü üzerinde belirli bir eylemi gerçekleştirmeniz gerekmiyorsa, bu nedenle, atılabilecek her bir özel durum türü için art arda yakalama işleyicileri kullanmaktan yorucu olduğunuzu düşünüyorum. Her halükarda, belirli istisnaları yakalasanız bile, genellikle kendinizi korumak ve program çökmelerini önlemek için System.Exception'ı yakalamanız gerekir. Böylece, kodumdaki tüm yerdeki System.Exception'ı yakalamayı buldum. Tipik bir senaryo, Windows Forms ve ASP.NET Web Formları uygulamalarında, tüm önemsiz olmayan olay işleyicileri try-catch System.Exception bloklarını içeren bir sonuçtur.

Sorun şu ki, bu kod hala biraz karışıklık ve gerçekten doğru görünmüyor. Daha iyi bir yolu var mı?

İlgili konular