Aracılığıyla paylaş


İşlenmemiş Özel Durumları İşleme (VB)

tarafından Scott Mitchell

Örnek kodu görüntüleme veya indirme (indirme)

Üretimdeki bir web uygulamasında çalışma zamanı hatası oluştuğunda, bir geliştiriciyi bilgilendirmek ve hatanın daha sonraki bir noktada tanılanabilmesi için günlüğe kaydetmek önemlidir. Bu öğretici, ASP.NET çalışma zamanı hatalarını nasıl işlediğine ilişkin bir genel bakış sağlar ve ASP.NET çalışma zamanına kadar işlenmeyen bir özel durum oluştuğunda özel kodun yürütülmesini sağlamak için tek bir yol sunar.

Giriş

bir ASP.NET uygulamasında işlenmeyen bir özel durum oluştuğunda, olayı tetikleyen ve uygun hata sayfasını görüntüleyen ASP.NET çalışma zamanına Error kadar kabarır. Üç farklı tür hata sayfası vardır: Çalışma Zamanı Hatası Ölüm Sarı Ekranı (YSOD); Özel Durum Ayrıntıları YSOD; ve özel hata sayfaları. Önceki öğreticide, uygulamayı uzak kullanıcılar için özel bir hata sayfası ve yerel olarak ziyaret eden kullanıcılar için Özel Durum Ayrıntıları YSOD kullanacak şekilde yapılandırdık.

Sitenin görünümüyle eşleşen insan dostu bir özel hata sayfası kullanmak varsayılan Çalışma Zamanı Hatası YSOD'ye tercih edilir, ancak özel hata sayfası görüntülemek kapsamlı bir hata işleme çözümünün yalnızca bir parçasıdır. Üretim ortamındaki bir uygulamada hata oluştuğunda, özel durumun nedenini ortaya çıkarabilmeleri ve giderebilmeleri için geliştiricilere hatanın bildirilmesi önemlidir. Ayrıca, hatanın daha sonraki bir noktada incelenebilmesi ve tanılanabilmesi için hatanın ayrıntıları günlüğe kaydedilmelidir.

Bu öğreticide, işlenmeyen bir özel durumun ayrıntılarına nasıl erişileceği gösterilmektedir, böylece bunlar günlüğe kaydedilebilir ve bir geliştiriciye bildirilebilir. Bu öğreticiden sonraki iki öğreticide, biraz yapılandırmadan sonra geliştiricilere çalışma zamanı hatalarını otomatik olarak bildirecek ve ayrıntılarını günlüğe kaydedecek hata günlüğü kitaplıkları incelenir.

Not

Bu öğreticide incelenen bilgiler, işlenmeyen özel durumları bazı benzersiz veya özelleştirilmiş bir şekilde işlemeniz gerekiyorsa en yararlı olacaktır. Yalnızca özel durumu günlüğe kaydetmeniz ve bir geliştiriciye bildirmeniz gereken durumlarda, hata günlüğü kitaplığını kullanmak yoldur. Sonraki iki öğretici, bu tür iki kitaplıkla ilgili genel bir bakış sağlar.

Olay oluşturulduğundaErrorkodu yürütme

Olaylar, bir nesneye ilginç bir şeyin oluştuğuna işaret eden bir mekanizma ve başka bir nesnenin yanıt olarak kod yürütmesi için bir mekanizma sağlar. ASP.NET geliştirici olarak olaylar açısından düşünmeye alışkınsınız. Ziyaretçi belirli bir Düğmeye tıkladığında bazı kodlar çalıştırmak istiyorsanız, söz konusu Düğmenin Click olayı için bir olay işleyicisi oluşturur ve kodunuzu buraya koyarsınız. İşlenmeyen bir özel durum oluştuğunda ASP.NET çalışma zamanının olayını yükselttiği Error göz önünde bulundurulduğunda, hatanın ayrıntılarını günlüğe kaydetme kodunun bir olay işleyicisine gitmesi gerekir. Ancak olay için nasıl bir olay işleyicisi Error oluşturursunuz?

Olay Error , isteğin ömrü boyunca HTTP işlem hattındaki HttpApplication belirli aşamalarda oluşturulan sınıftaki birçok olaydan biridir. Örneğin, sınıfın HttpApplication BeginRequest olayı her isteğin başlangıcında oluşturulur; AuthenticateRequest bir güvenlik modülü istek sahibini tanımladığında olayı oluşturulur. Bu HttpApplication olaylar, sayfa geliştiricisine isteğin ömrü boyunca çeşitli noktalarda özel mantık yürütmesi için bir araç sağlar.

Olaylar için HttpApplication olay işleyicileri adlı Global.asaxözel bir dosyaya yerleştirilebilir. Bu dosyayı web sitenizde oluşturmak için, adlı Global.asaxGenel Uygulama Sınıfı şablonunu kullanarak web sitenizin köküne yeni bir öğe ekleyin.

Web sitenizde bu dosyayı oluşturmak için Global.asax adlı Genel Uygulama Sınıfı şablonunu kullanarak web sitenizin köküne yeni öğe ekleme işleminin ekran görüntüsü.

Şekil 1: Web uygulamanıza ekleme Global.asax
(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Visual Studio tarafından oluşturulan dosyanın içeriği ve yapısı Global.asax , Web Uygulaması Projesi (WAP) veya Web Sitesi Projesi (WSP) kullanmanıza bağlı olarak biraz farklılık gösterir. WAP ile , Global.asax ve Global.asax.vbolmak üzere iki ayrı dosya Global.asax olarak uygulanır. Dosya, Global.asax dosyaya .vb başvuran bir yönergeden başka bir @Application şey içermiyor; ilgili olay işleyicileri dosyada Global.asax.vb tanımlanır. WSP'ler için yalnızca tek bir dosya oluşturulur Global.asaxve olay işleyicileri bir <script runat="server"> blokta tanımlanır.

Global.asax Visual Studio'nun Genel Uygulama Sınıfı şablonu tarafından WAP'de oluşturulan dosya, sırasıyla , Application_AuthenticateRequestve Application_Errorolay işleyicileri olan , AuthenticateRequestve Erroradlı Application_BeginRequestolay BeginRequestişleyicilerini HttpApplication içerir. Ayrıca, Session_StartApplication_Endweb uygulaması başlatıldığında, yeni bir oturum başlatıldığında, uygulama sona erdiğinde ve Session_Endsırasıyla bir oturum sona erdiğinde tetiklenen olay işleyicileri olan , , ve adlı Application_Startolay işleyicileri de vardır. Global.asax Visual Studio tarafından WSP'de oluşturulan dosya yalnızca Application_Error, Application_Start, Session_Start, Application_Endve Session_End olay işleyicilerini içerir.

Not

ASP.NET uygulamasını dağıtırken dosyayı üretim ortamına kopyalamanız Global.asax gerekir. Global.asax.vb WAP'de oluşturulan dosyanın, bu kod projenin derlemesinde derlendiğinden üretime kopyalanması gerekmez.

Visual Studio'nun Genel Uygulama Sınıfı şablonu tarafından oluşturulan olay işleyicileri kapsamlı değildir. Olay işleyicisini adlandırarak herhangi bir HttpApplication olay için bir olay işleyicisi Application_EventNameekleyebilirsiniz. Örneğin, dosyaya Global.asax aşağıdaki kodu ekleyerek olay için bir olay işleyicisi AuthorizeRequest oluşturabilirsiniz:

Sub Application_AuthorizeRequest(ByVal sender As Object, ByVal e As EventArgs)
    ' Event handler code
End Sub

Benzer şekilde, Genel Uygulama Sınıfı şablonu tarafından oluşturulan ve gerekli olmayan tüm olay işleyicilerini kaldırabilirsiniz. Bu öğreticide yalnızca olay için bir olay işleyicisi Error gerekir; diğer olay işleyicilerini dosyadan kaldırmaktan Global.asax çekinmeyin.

Not

HTTP Modülleri, olaylar için HttpApplication olay işleyicilerini tanımlamanın başka bir yolunu sunar. HTTP Modülleri, doğrudan web uygulaması projesine yerleştirilebilen veya ayrı bir sınıf kitaplığına ayrılabilen bir sınıf dosyası olarak oluşturulur. Http Modülleri bir sınıf kitaplığına ayrılabildiğinden, olay işleyicileri oluşturmak HttpApplication için daha esnek ve yeniden kullanılabilir bir model sunar. Global.asax Dosya bulunduğu web uygulamasına özgü olsa da, HTTP Modülleri derlemeler halinde derlenebilir; bu noktada HTTP Modülünü bir web sitesine eklemek, derlemeyi Bin klasörüne bırakmak ve Modülü 'Web.configye kaydetmek kadar basittir. Bu öğreticide HTTP Modülleri oluşturma ve kullanma konusuna bakılmaz, ancak aşağıdaki iki öğreticide kullanılan iki hata günlüğü kitaplığı HTTP Modülleri olarak uygulanır. HTTP Modüllerinin avantajları hakkında daha fazla arka plan için bkz . Takılabilir ASP.NET Bileşenleri Oluşturmak için HTTP Modülleri ve İşleyicileri Kullanma.

İşlenmeyen Özel Durum Hakkında Bilgi Alma

Bu noktada, olay işleyicisi olan Application_Error bir Global.asax dosyası var. Bu olay işleyicisi yürütürken bir geliştiriciye hatayı bildirmemiz ve ayrıntılarını günlüğe kaydetmemiz gerekir. Bu görevleri gerçekleştirmek için öncelikle ortaya çıkarılan özel durumun ayrıntılarını belirlememiz gerekir. Olayın tetiklenmeye neden olan işlenmeyen özel durumun ayrıntılarını almak için Sunucu nesnesinin GetLastError Error yöntemini kullanın.

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    ' Get the error details
    Dim lastErrorWrapper As HttpException = _
        CType(Server.GetLastError(), HttpException)
End Sub

GetLastError yöntemi, .NET Framework'teki tüm özel durumlar için temel tür olan türünde Exceptionbir nesnesi döndürür. Ancak yukarıdaki kodda tarafından döndürülen GetLastError Exception nesnesini bir HttpException nesneye atıyorum. Error bir ASP.NET kaynağı işlenirken bir özel durum oluştuğundan olay tetikleniyorsa, oluşturulan özel durum içinde HttpExceptionsarmalanır. Error olayına neden olan gerçek özel durumu almak için özelliğini kullanın InnerException . Error Olay, var olmayan bir sayfaya yönelik istek gibi HTTP tabanlı bir özel durum nedeniyle oluşturulduysa, bir HttpException oluşturulur, ancak iç özel durumu yoktur.

Aşağıdaki kod, olayını tetikleyen Error özel durum hakkındaki bilgileri almak ve adlı lastErrorWrapperbir değişkende depolamak için öğesini HttpException kullanırGetLastErrormessage. Ardından, kaynak özel durumun türünü, iletisini ve yığın izlemesini üç dize değişkeninde depolar ve olayını tetikleyen Error gerçek özel durum olup olmadığını lastErrorWrapper (HTTP tabanlı özel durumlar söz konusu olduğunda) veya yalnızca isteği işlerken oluşan bir özel durum için sarmalayıcı olup olmadığını denetler.

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    ' Get the error details
    Dim lastErrorWrapper As HttpException = _
        CType(Server.GetLastError(), HttpException)

    Dim lastError As Exception = lastErrorWrapper
    If lastErrorWrapper.InnerException IsNot Nothing Then
        lastError = lastErrorWrapper.InnerException
    End If

    Dim lastErrorTypeName As String = lastError.GetType().ToString()
    Dim lastErrorMessage As String = lastError.Message
    Dim lastErrorStackTrace As String = lastError.StackTrace
End Sub

Bu noktada, özel durumun ayrıntılarını bir veritabanı tablosuna kaydedecek kod yazmak için ihtiyacınız olan tüm bilgilere sahip olursunuz. İstenen sayfanın URL'si ve oturum açmış durumdaki kullanıcının adı gibi diğer yararlı bilgi parçalarıyla birlikte, ilgilendiğiniz hata ayrıntılarının her biri (tür, ileti, yığın izleme vb.) sütunlarını içeren bir veritabanı tablosu oluşturabilirsiniz. Olay işleyicisinde Application_Error veritabanına bağlanır ve tabloya bir kayıt eklersiniz. Benzer şekilde, e-posta yoluyla bir geliştiriciyi hatayla ilgili uyarmak için kod ekleyebilirsiniz.

Sonraki iki öğreticide incelenen hata günlüğü kitaplıkları bu tür işlevleri kullanıma sunar, bu nedenle bu hata günlüğünü oluşturmanıza ve bildirimi kendiniz oluşturmanıza gerek yoktur. Ancak, olayın tetiklendiğini ve olay işleyicisinin Application_Error hata ayrıntılarını günlüğe kaydetmek ve bir geliştiriciyi bilgilendirmek için kullanılabileceğini göstermek Error için bir hata oluştuğunda geliştiriciye bildirimde bulunan kod ekleyelim.

İşlenmeyen Bir Özel Durum Oluştuğunda Geliştiriciye Bildirme

Üretim ortamında işlenmeyen bir özel durum oluştuğunda, hatayı değerlendirebilmeleri ve hangi eylemlerin yapılması gerektiğini belirleyebilmeleri için geliştirme ekibini uyarmak önemlidir. Örneğin, veritabanına bağlanırken bir hata varsa bağlantı dizesi iki kez denetlemeniz ve belki de web barındırma şirketinizle bir destek bileti açmanız gerekir. Bir programlama hatası nedeniyle özel durum oluştuysa, gelecekte bu tür hataları önlemek için ek kod veya doğrulama mantığı eklenmesi gerekebilir.

Ad alanı içindeki System.Net.Mail .NET Framework sınıfları, e-posta göndermeyi kolaylaştırır. MailMessage sınıfı bir e-posta iletisini temsil eder ve , From, Subject, Bodyve Attachmentsgibi Toözelliklere sahiptir. SmtpClass belirtilen SMTP sunucusunu kullanarak bir MailMessage nesne göndermek için kullanılır; SMTP sunucusu ayarları içindeki öğesinde <system.net> Web.config fileprogramlı veya bildirimli olarak belirtilebilir. ASP.NET bir uygulamada e-posta iletileri gönderme hakkında daha fazla bilgi için ASP.NET Web Sayfaları Sitesinden E-posta Gönderme ve System.Net.Mail makaleme göz atın.

Not

öğesi, <system.net> e-posta gönderirken sınıfı tarafından SmtpClient kullanılan SMTP sunucusu ayarlarını içerir. Web barındırma şirketinizin büyük olasılıkla uygulamanızdan e-posta göndermek için kullanabileceğiniz bir SMTP sunucusu vardır. Web uygulamanızda kullanmanız gereken SMTP sunucusu ayarları hakkında bilgi için web barındırma sağlayıcınızın destek bölümüne bakın.

Hata oluştuğunda Application_Error geliştiriciye e-posta göndermek için olay işleyicisine aşağıdaki kodu ekleyin:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    ' Get the error details
    Dim lastErrorWrapper As HttpException = _
        CType(Server.GetLastError(), HttpException)
    
    Dim lastError As Exception = lastErrorWrapper
    If lastErrorWrapper.InnerException IsNot Nothing Then
        lastError = lastErrorWrapper.InnerException
    End If

    Dim lastErrorTypeName As String = lastError.GetType().ToString()
    Dim lastErrorMessage As String = lastError.Message
    Dim lastErrorStackTrace As String = lastError.StackTrace

    Const ToAddress As String = "support@example.com"
    Const FromAddress As String = "support@example.com"
    Const Subject As String = "An Error Has Occurred!"

    ' Create the MailMessage object
    Dim mm As New MailMessage(FromAddress, ToAddress)
    mm.Subject = Subject
    mm.IsBodyHtml = True
    mm.Priority = MailPriority.High
  mm.Body = string.Format( _
"<html>" & vbCrLf & _
"  <body>" & vbCrLf & _
"  <h1>An Error Has Occurred!</h1>" & vbCrLf & _
"  <table cellpadding=""5"" cellspacing=""0"" border=""1"">" & vbCrLf & _
"  <tr>" & vbCrLf & _
"  <tdtext-align: right;font-weight: bold"">URL:</td>" & vbCrLf & _
"  <td>{0}</td>" & vbCrLf & _
"  </tr>" & vbCrLf & _
"  <tr>" & vbCrLf & _
"  <tdtext-align: right;font-weight: bold"">User:</td>" & vbCrLf & _
"  <td>{1}</td>" & vbCrLf & _
"  </tr>" & vbCrLf & _
"  <tr>" & vbCrLf & _
"  <tdtext-align: right;font-weight: bold"">Exception Type:</td>" & vbCrLf & _
"  <td>{2}</td>" & vbCrLf & _
"  </tr>" & vbCrLf & _
"  <tr>" & vbCrLf & _
"  <tdtext-align: right;font-weight: bold"">Message:</td>" & vbCrLf & _
"  <td>{3}</td>" & vbCrLf & _
"  </tr>" & vbCrLf & _
"  <tr>" & vbCrLf & _
"  <tdtext-align: right;font-weight: bold"">Stack Trace:</td>" & vbCrLf & _
"  <td>{4}</td>" & vbCrLf & _
"  </tr> " & vbCrLf & _
"  </table>" & vbCrLf & _
"  </body>" & vbCrLf & _
"</html>", _
  Request.RawUrl, _
  User.Identity.Name, _
  lastErrorTypeName, _
  lastErrorMessage, _
  lastErrorStackTrace.Replace(Environment.NewLine, "<br />"))

    'Attach the Yellow Screen of Death for this error
    Dim YSODmarkup As String = lastErrorWrapper.GetHtmlErrorMessage()
    If Not String.IsNullOrEmpty(YSODmarkup) Then
        Dim YSOD As Attachment = _
            Attachment.CreateAttachmentFromString(YSODmarkup, "YSOD.htm")
        mm.Attachments.Add(YSOD)
    End If

    ' Send the email
    Dim smtp As New SmtpClient()
    smtp.Send(mm)
End Sub

Yukarıdaki kod oldukça uzun olsa da, büyük kısmı geliştiriciye gönderilen e-postada görünen HTML'yi oluşturur. Kod, yöntemilastErrorWrapper () tarafından döndürülene GetLastError başvurarak HttpException başlar. İstek tarafından tetiklenen gerçek özel durum aracılığıyla lastErrorWrapper.InnerException alınır ve değişkenine lastErroratanır. Tür, ileti ve yığın izleme bilgileri üç dize değişkeninden lastError alınır ve depolanır.

Ardından adlı mm bir MailMessage nesne oluşturulur. E-posta gövdesi HTML biçimindedir ve istenen sayfanın URL'sini, oturum açmış durumdaki kullanıcının adını ve özel durum hakkındaki bilgileri (tür, ileti ve yığın izleme) görüntüler. Sınıfıyla ilgili HttpException en önemli şeylerden biri, GetHtmlErrorMessage yöntemini çağırarak Özel Durum Ayrıntıları Sarı Ölüm Ekranı 'nı (YSOD) oluşturmak için kullanılan HTML'yi oluşturabilmenizdir. Bu yöntem burada Özel Durum Ayrıntıları YSOD işaretlemesini almak ve e-postaya ek olarak eklemek için kullanılır. Dikkatli olun: Olayı tetikleyen Error özel durum HTTP tabanlı bir özel durumsa (var olmayan bir sayfaya yönelik istek gibi) GetHtmlErrorMessage yöntemi döndürür null.

Son adım göndermektir MailMessage. Bu, yeni SmtpClient bir yöntem oluşturup yöntemini çağırarak Send yapılır.

Not

Bu kodu web uygulamanızda kullanmadan önce ve FromAddress sabitlerindeki ToAddress support@example.com değerleri, hata bildirimi e-postasının gönderilmesi ve kaynaklanması gereken e-posta adresiyle değiştirmek istersiniz. ayrıca içindeki bölümünde Web.configSMTP sunucusu ayarlarını <system.net> belirtmeniz gerekir. Kullanılacak SMTP sunucusu ayarlarını belirlemek için web barındırma sağlayıcınıza başvurun.

Bu kod her hata olduğunda geliştiriciye hatayı özetleyen ve YSOD'yi içeren bir e-posta iletisi gönderilir. Önceki öğreticide, Genre.aspx ziyaret ederek ve gibi Genre.aspx?ID=foosorgu dizesi aracılığıyla geçersiz ID bir değer geçirerek bir çalışma zamanı hatası gösterdik. Dosyanın olduğu sayfayı Global.asax ziyaret etmek, önceki öğreticidekiyle aynı kullanıcı deneyimini oluşturur. Geliştirme ortamında Özel Durum Ayrıntıları Sarı Ölüm Ekranı'nı görmeye devam ederken üretim ortamında özel hata sayfasını görürsünüz. Bu mevcut davranışa ek olarak geliştiriciye bir e-posta gönderilir.

Şekil 2'de ziyaret ederken alınan e-posta gösterilmektedir Genre.aspx?ID=foo. E-posta gövdesi özel durum bilgilerini özetlerken YSOD.htm ek, Özel Durum Ayrıntıları YSOD'de gösterilen içeriği görüntüler (bkz . Şekil 3).

Özel durum bilgileriyle birlikte alınan e-postanın ekran görüntüsü.

Şekil 2: İşlenmeyen bir özel durum olduğunda geliştiriciye bir e-posta bildirimi gönderilir
(Tam boyutlu görüntüyü görüntülemek için tıklayın)

İşlenmeyen bir özel durum olduğunda Geliştirici tarafından alınan e-posta bildiriminin ekran görüntüsü.

Şekil 3: E-posta Bildirimi, Özel Durum Ayrıntıları YSOD'yi ek olarak içerir
(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Özel Hata Sayfasını Kullanmaya Ne Dersin?

Bu öğreticide, işlenmeyen bir özel durum oluştuğunda Application_Error kodu yürütmek için ve olay işleyicisinin nasıl kullanılacağı Global.asax gösterildi. Özellikle, bir geliştiriciye bir hatayı bildirmek için bu olay işleyicisini kullandık; hata ayrıntılarını da veritabanında günlüğe kaydedecek şekilde genişletebiliriz. Olay işleyicisinin Application_Error varlığı son kullanıcının deneyimini etkilemez. Hata Ayrıntıları YSOD, Çalışma Zamanı Hatası YSOD veya özel hata sayfası gibi yapılandırılmış hata sayfasını görmeye devam ederler.

Özel bir hata sayfası kullanılırken dosyanın ve Application_Error olayın gerekli olup olmadığını Global.asax merak etmek doğaldır. Bir hata oluştuğunda kullanıcıya özel hata sayfası gösterilir, bu nedenle neden geliştiriciyi bilgilendirmek ve hata ayrıntılarını özel hata sayfasının arka kod sınıfına kaydetmek için kodu koyamıyoruz? Özel hata sayfasının arka planda kod sınıfına kod ekleyebilirsiniz ancak önceki öğreticide incelediğimiz tekniği kullanırken olayı tetikleyen Error özel durumun ayrıntılarına erişiminiz yoktur. GetLastError Yöntemini özel hata sayfasından çağırmak döndürürNothing.

Bu davranışın nedeni, özel hata sayfasına yeniden yönlendirme yoluyla ulaşılıyor olmasıdır. İşlenmeyen bir özel durum ASP.NET çalışma zamanına ulaştığında, ASP.NET altyapısı olayını başlatır Error (olay işleyicisini yürütürApplication_Error) ve ardından bir Response.Redirect(customErrorPageUrl)vererek kullanıcıyı özel hata sayfasına yönlendirir. Response.Redirect yöntemi, istemciye HTTP 302 durum koduyla bir yanıt gönderir ve tarayıcıya özel hata sayfası olarak yeni bir URL istemesi talimatını gönderir. Ardından tarayıcı bu yeni sayfayı otomatik olarak istemektedir. Tarayıcının Adres çubuğu özel hata sayfası URL'sine değiştiğinden özel hata sayfasının hatanın kaynaklandığı sayfadan ayrı olarak istendiğini anlayabilirsiniz (bkz . Şekil 4).

Hata oluştuğunda Özel Hata Sayfası U R L'ye yönlendirilen tarayıcının ekran görüntüsü.

Şekil 4: Bir Hata Oluştuğunda Tarayıcı Özel Hata Sayfası URL'sine Yeniden Yönlendirilir
(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Net etki, sunucu HTTP 302 yeniden yönlendirmesiyle yanıtladığında işlenmeyen özel durumun oluştuğu isteğin sona ermesidir. Özel hata sayfasına yapılan sonraki istek yepyeni bir istektir; Bu noktada ASP.NET altyapısı hata bilgilerini atmıştır ve ayrıca önceki istekteki işlenmeyen özel durumu özel hata sayfası için yeni istekle ilişkilendirmenin bir yolu yoktur. Bu nedenle GetLastError özel hata sayfasından çağrıldığında döndürülüyor null .

Ancak, hataya neden olan istek sırasında özel hata sayfasının yürütülmesi mümkündür. yöntemi, Server.Transfer(url) yürütmeyi belirtilen URL'ye aktarır ve aynı istek içinde işler. Olay işleyicisindeki Application_Error kodu özel hata sayfasının arka planda kod sınıfına taşıyabilir ve içindeki Global.asax kodu aşağıdaki kodla değiştirebilirsiniz:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    ' Get the error details
    Dim lastErrorWrapper As HttpException = _
        CType(Server.GetLastError(), HttpException)

    If lastErrorWrapper.GetHttpCode() = 404 Then
        Server.Transfer("~/ErrorPages/404.aspx")
    Else
        Server.Transfer("~/ErrorPages/Oops.aspx")
    End If
End Sub

İşlenmeyen bir özel durum oluştuğunda Application_Error , olay işleyicisi denetimi HTTP durum koduna göre uygun özel hata sayfasına aktarır. Denetim aktarıldığı için özel hata sayfası aracılığıyla Server.GetLastError işlenmeyen özel durum bilgilerine erişebilir ve bir geliştiriciye hatayı bildirebilir ve ayrıntılarını günlüğe kaydedebilir. Çağrı, Server.Transfer ASP.NET altyapısının kullanıcıyı özel hata sayfasına yönlendirmesini durdurur. Bunun yerine özel hata sayfasının içeriği, hatayı oluşturan sayfaya yanıt olarak döndürülür.

Özet

bir ASP.NET web uygulamasında işlenmeyen bir özel durum oluştuğunda, ASP.NET çalışma zamanı olayı başlatır Error ve yapılandırılan hata sayfasını görüntüler. Hata için bir olay işleyicisi oluşturarak hatayı geliştiriciye bildirebilir, ayrıntılarını günlüğe kaydedebilir veya başka bir şekilde işleyebiliriz. Olaylar için HttpApplication Errorolay işleyicisi oluşturmanın Global.asax iki yolu vardır: dosyasında veya http modülünden. Bu öğreticide, e-posta iletisi yoluyla geliştiricilere hata bildiren dosyada Global.asax bir olay işleyicisinin nasıl oluşturulacağı Error gösterildi.

İşlenmeyen özel durumları benzersiz veya özelleştirilmiş bir Error şekilde işlemeniz gerekiyorsa olay işleyicisi oluşturmak yararlıdır. Ancak, özel durumu günlüğe kaydetmek veya bir geliştiriciyi bilgilendirmek için kendi Error olay işleyicinizi oluşturmak, dakikalar içinde ayarlanabilen ücretsiz ve kullanımı kolay hata günlüğü kitaplıkları mevcut olduğundan zamanınızın en verimli kullanımı değildir. Sonraki iki öğreticide bu tür iki kitaplık incelenir.

Mutlu Programlama!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın: