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).
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.