ASP.Net pāradresācijas un kļūdu apstrāde

ASP.Net, kaut gan tā lapas paredzētas darbam kā notikumu bāzētas web formas, spēj strādāt arī ar vienkāršiem HTTP jēdzieniem, piemēram, HTTP headeriem. Viens no populāriem headerim ir Location, kura semantiskā jēga ir paziņojums HTTP aģentam (pārlūkprogrammai) “pārtrauc šī dokumenta apstrādi un pieprasi tā vietā šo te dokumentu!”

ASP.Net šāda iespēja ir pieejama, lietojot Response objekta Redirect() metodi. Piemēram,

If booleanNosacijums Then
       Response.Redirect("http://naivist.net")
End If

Ja vien Redirect() metodei netiek speciāli norādīts, ka otrā neobligātā parametra EndResponse vērtība ir False, šajā brīdī notiek sekojošais:

  • lietotājam tiek nosūtīts HTTP headeris Location:http://naivist.net
  • ASP.Net iekšienē tiek mesta System.Threading.ThreadAbortException kļūda, kuru pārķer .Net runtime un aptur pašreiz izpildāmā pavediena darbību.

Šāds darbības princips garantē to, ka pēc pāradresācijas headera nosūtīšanas tālākais kods neizpildīsies. Ja pavediens netiktu apturēts, izpildītos citi notikumu apstrādes koda fragmenti rezultāti tiktu nosūtīti klientam pēc pāradresācijas headera (kur lietotājs to vienala uz ekrāna neredzētu).

Kā zināms, labi programmētāji lieto strukturēto kļūdu apstrādi. Piemēram, faila dzēšanu ievieto Try-Catch blokā. Ja failu neizdosies nodzēst, kodā notiks ar kļūda, kas tiks noķerta Catch blokā. Ja failu izdosies nodzēst, pēc dzēšanas pāradresēsimies uz citu lapu.

    Try
        Dim oFile As New IO.FileInfo("c:\temp\fails.txt")
        oFile.Delete()
        Response.Redirect("failsLabiNodzests.aspx")
    Catch ex As Exception
        Me.lblInfo.Text="Nav izdevies nodzēst failu"
       System.Diagnostics.EventLog.WriteEntry("MyApp",  _
                                      "Kļūda dzēšot failu", EventLogEntryType.Error)
    End Try

Tomēr šāds kods nestrādās īsti korekti, jo arī pie veiksmīgas faila dzēšanas izpildīsies Catch bloks, noķerot ThreadAbortException kļūdu. Līdz ar to EventLog parādīsies nekorekta informācija.

Viens no veidiem, kā novērst problēmu, ir vispirms ķert specifisko ThreadAbortException kļūdu un tikai tad apstrādāt pārējās:

    Catch ex As Threading.ThreadAbortException
        Throw ex
    Catch ex As Exception 
    ...

Šāds veids ir funkcionāls, bet nav elegants, jo kļūda tiek ķerta un pārmesta vēlreiz – neglīti. Lietojot Visual Basic .Net specifisko kļūdu apstrādes principu, kodu var padarīt elegantāku:

    Catch ex As Exception When _
        Not TypeOf (ex) Is Threading.ThreadAbortException
        Me.lblInfo.Text="Nav izdevies nodzēst failu"
   ...

Tagad tiek ķertas tikai tās kļūdas, kuru tips nav ThreadAbortException, kas arī bija jāpanāk. When nosacījumā drīkst ierakstīt jebkādu nosacījumu, kura izpildes rezultāts ir Boolean tipa. Ir iespējams izmantot arī kodā definētu mainīgo vērtības, ar nosacījumu, ka mainīgais ir redzamības apgabalā (variable scope).

One thought on “ASP.Net pāradresācijas un kļūdu apstrāde”

  1. Pēc Microsoft vadlīnijām (FxCop) nav labi jau pēc būtības ķert Exception. Tā vietā ir jāķer tikai tie Exception, ko var izraisīt šajā gadījumā Delete operācija.

    Ir gadījies redzēt, ka Response.Redirect notiek pēc Exception. Tajā gadījumā Exception, protams, nenotiek. Ziņojums EventLogā ierakstās taču diemžēl lietotājs uz ekrāna neko neredz.

Comments are closed.