|
[ oggie @ 11.12.2006. 09:46 ] @
| Kako u ASP 2.0 VB kodu da uhvatim kod greske da bi je handlovao. Na primer ako ubacujem dupli kljuc u tabelu meni se pojavi poruka "Cannot insert duplicate key in object" u delu koda x.message
Catch x As Exception
Trace.Write("Greska: " & x.Message & " vreme: " & Date.Now)
E sad kako da uhvatim kod te greske i da kazem npr:
Case xxxx:
poruka: Ne mozete uneti dupli kljuc. |
[ oggie @ 13.12.2006. 14:45 ] @
Da li je moguce da nema odgovora na ovo pitanje. Evo da malo pojasnim, voleo bih da koristim kod nalik onom u VB 6:
Err:
Select Case Err.Number
Case -2147467259, 17:
MsgBox "Ne postoji konekcija sa bazom"
Case 2627, 3621:
MsgBox "Polje ima jedinstvenu vrednost, ne mozete uneti dva puta istu vrednost."
Case Else
MsgBox (Err.Source & vbCrLf & Err.Description & vbCrLf & Err.Number)
End Select
Da li u ASP 2.0 postoji nesto tipa Err.Number umesto Err.Message?
[ bunker @ 14.12.2006. 07:53 ] @
Catch x As SqlException
select case x.Number....
znaci isto, samo je exception drugog tipa.
[ oggie @ 14.12.2006. 08:01 ] @
Hvala na odgovoru, citao sam dosta o tim exception-ima i prilicno mi je to zbunjujuce.
Shvatam to za sqlexception, ali sta ako mi se pojavi na primer greska deljenje nulom, to nije sqlexpection.....
To znaci da treba da hvatam razlicite tipove exceptiona, a ne znam unapred koji ce se desiti.
Malo cudan pristup, VB6 je bio bolji jer ima jedan Error i sto god da se desi ja dobijem kod te greske i opis.
Hvala jos jednom.
[ negyxo @ 14.12.2006. 08:21 ] @
Oggie koristi pretragu. Nedavno smo o tome vec diskutovali u ovoj temi http://www.elitesecurity.org/t228746-0#1371630
Inace pristup nije cudan. Pristup je, mislim, under the hood veoma slican, s tim sto je ovaj sa try & catch daleko bolji pristup. (ovo se odnosi pogotovo na ugnjezdene try & cath blokove, gde je po onom principu u VB6 bio to nightmare.)
[ oggie @ 14.12.2006. 10:25 ] @
Koristim ja pretragu ali sam pocetnik i jos uvek mi je mozak nastelovan na VB6 logiku....treba mi malo vremena da svarim sve ove novine.
Ono sto nisam uspeo da shvatim je sledece:
Imam jednu klasu Klasa1 koja ima funkciju Select koja izgleda otprilike ovako:
Public Function Select(ByVal Tabela As String) As DataTable
Select= Nothing
Try
Dim con As SqlConnection
Dim adapter As SqlDataAdapter
Dim dt As New DataTable
Dim konekcija As Konekcija = New Konekcija
con = konekcija.con_open()
Dim sql As String
sql = "SELECT * from " & Tabela
adapter = New SqlDataAdapter(sql, con)
adapter.Fill(dt)
adapter.Dispose()
Select= dt
con = konekcija.con_close
Catch x As SqlException
Trace.Write("Greska: " & x.Message & " vreme: " & Date.Now)
Debug.Write(x.Number)
End Try
End Function
Zatim imam webformu i na Page_Load treba da popunim gridview.
Page_Load
Try
If Not Page.IsPostBack Then
Dim k As Klasa1=New Klasa1
Dim dt as DataTable=New dataTable
dt = k.Select("TabelaX")
If dt.Rows.Count = 0 Then
gridview.DataSource = dt
gridview.DataBind()
end if
End If
Catch x As SqlException
Trace.Write("Greska: " & x.Message & " vreme: " & Date.Now)
Response.Write(x.Message)
End Try
end sub
Koji problem imam? Ako se greska desi u klasi, npr ne moze da nadje tu tabelu, on ode u Catch blok, prikaze gresku, ali se vrati u formu i nastavi rad. Na formi ce gresku prikazati tek u delu kad dodje do dt.rows.count jer je dt nothing.
E sad moja velika mora je kako da cim pukne u klasi da me odmah prebaci na gresku u formi, tj. da forma preuzme gresku iz klase.
Dalje, pokusao sam u klasi da napisem Response.Write ali ne radi u klasi.
Pokusao sam u klasi da napravim promenljivu Session.Add("Greska", 0) ali ovo ne radi u klasi.
Znaci kako iz klase prebaciti gresku na formu i odmah obustaviti rad cim greska nastane?
[ oggie @ 14.12.2006. 10:43 ] @
Jos sam zaboravio da dodam, kada u formi na Page_Load stavim break point na dt=k.Select("")....meni prilikom debugovanja kod ne prelazi u klasu sem ako i na klasi nisam stavio break point.
U VB6 mi je direktno iz forme prelazio u klasu kod debugovanja i gresku mi je iz klase prebacivao direktno u Err blok forme.
Da li se ovde radi o drugacijem pristupu u ASP.NET ili treba mozda nesto da se setuje. U VB6 je bilo ono setovanje u Tool Options:
Break on all errors
Break in Class Module
Break on Unhandles errors
[ bunker @ 14.12.2006. 11:43 ] @
Code:
Public Function Select(ByVal Tabela As String) As DataTable
Select= Nothing
Try
Dim con As SqlConnection
Dim adapter As SqlDataAdapter
Dim dt As New DataTable
Dim konekcija As Konekcija = New Konekcija
con = konekcija.con_open()
Dim sql As String
sql = "SELECT * from " & Tabela
adapter = New SqlDataAdapter(sql, con)
adapter.Fill(dt)
adapter.Dispose()
Select= dt
con = konekcija.con_close
Catch x As SqlException
Trace.Write("Greska: " & x.Message & " vreme: " & Date.Now)
Debug.Write(x.Number)
'added by ssrdjan
Throw x 'Ovo cce izbaciti gresku u drugi catch block (onaj u formi)
'dodaj i ovo
Catch xZero As DivisionByZeroException 'mislim da se ovako zove
Trace.Write("Greska: " & xZero.Message & " vreme: " & Date.Now)
Throw xZero
Catch xBase As Exception
Trace.Write("Greska: " & xBase.Message & " vreme: " & Date.Now)
Throw xBase 'Ovaj throw cce srusiti tvoju aplikaciju zato sto u try-catch forme ne hvatas Exception vecc samo SqlException
''ovo cce resiti tvoje probleme. I pazi na ovo, supercall exception mora biti ispod ostalih, jer ako
''uhvatis Exception necces mocci da procesuiras ostale.
End Try
End Function
Zatim imam webformu i na Page_Load treba da popunim gridview.
Page_Load
Try
If Not Page.IsPostBack Then
Dim k As Klasa1=New Klasa1
Dim dt as DataTable=New dataTable
dt = k.Select("TabelaX")
If dt.Rows.Count = 0 Then
gridview.DataSource = dt
gridview.DataBind()
end if
End If
Catch x As SqlException
Trace.Write("Greska: " & x.Message & " vreme: " & Date.Now)
Response.Write(x.Message)
End Try
Za prelazak u kod klase, nije dovoljno da koristis next step u debugeru, vecc step into (F11). Ovo cce te prebaciti u kod klase. Znaci sa F10 mozes da preskocis ulazak u blok, a sa F11 forsiras ulazak.
Treniraj malo sa ovim Try-Catch, ne znam zasto si toliko zakasnio na to. Zaboravi VB6 kad predes na ovo. Narocito ti preporucujem da zaboravis one VB6 ruzne funkcije kao Left, Right Msg itd. Ovde se radi strogo po oop standardima.
string.PadLeft, string.PadRight...
Obrati paznju da jedan try blok moze imati vise catch-ova
Try
Catch
Catch
Catch
Finally
End Try
[ oggie @ 14.12.2006. 11:55 ] @
Hvala puno za ovo F11, stvarno nigde nisam naisao na to (a da ne pricam kako jos uvek mahinalno pritiskam F8). Kako jedna sitnica puno znaci kad znas za foru.
Ali jos uvek nemam odgovor kako da gresku iz klase prebacim u gresku na formi automatski cim nastane, da ne ide dalje po kodu u formi. Znaci ako u klasi ne ostvari konekciju da odmah prijavi gresku.
Sto se tice tvojih saveta za .NET ja koristim VB jer ne znam C# mada vidim da se c# vise koristi. Vidim u C# kodu stalno MessageBox.Show pa se pitam jel to samo za c# ili postoji nesto i za VB ali ja ne znam?
Jos jednom puno hvala.
[ negyxo @ 14.12.2006. 12:00 ] @
Oggie nemoj da se ljutis ali ovo sve spada u domen pocetnika. Za detalje najbolje je da otkucas u MSDN try-catch za VB i da procitas i posvetis malo vremena izucavanju VB.NET-a - jer je znacajno drukciji (a bice i vise u sledecim verzijama pojavom funkcijske paradigme).
Ali da ne bude da sam te samo redirectovao (znam koliko ljudi mrze kad im treba odgovor jos juce  ), odgovoricu ukratko.
Citat:
Koji problem imam? Ako se greska desi u klasi, npr ne moze da nadje tu tabelu, on ode u Catch blok, prikaze gresku, ali se vrati u formu i nastavi rad. Na formi ce gresku prikazati tek u delu kad dodje do dt.rows.count jer je dt nothing.
E sad moja velika mora je kako da cim pukne u klasi da me odmah prebaci na gresku u formi, tj. da forma preuzme gresku iz klase.
Dalje, pokusao sam u klasi da napisem Response.Write ali ne radi u klasi.
Pokusao sam u klasi da napravim promenljivu Session.Add("Greska", 0) ali ovo ne radi u klasi.
Znaci kako iz klase prebaciti gresku na formu i odmah obustaviti rad cim greska nastane?
Ovaj primer sto si naveo, najbolje ilustruje upotrebu try & catch bloka. Kada se dogodi greska unutar odredjene funkcije - funkcija moze da ga uhvati i obradi ali onda dolazis do ovog tvog 'problema'. Ukoliko pozivana f-ja obradi exception, onda ce pozivni kod izgubiti tu informaciju (kao u tvom slucaju, kada se iz f-je vrati nothing zbog handlovanog exception-a unutar f-je). Zato je najbolje da izbacis nanovo gresku(throw) pa ce ti code puci kod poziva f-je. Cak sta vise, mogao bi da izostavis try & catch blok iz f-je, pa bi dobio isti efekat ali onda moras dobro znati sta radis jer neces imati mogucnosti da uradis clean-up.
Citat:
Jos sam zaboravio da dodam, kada u formi na Page_Load stavim break point na dt=k.Select("")....meni prilikom debugovanja kod ne prelazi u klasu sem ako i na klasi nisam stavio break point.
U VB6 mi je direktno iz forme prelazio u klasu kod debugovanja i gresku mi je iz klase prebacivao direktno u Err blok forme.
Da li se ovde radi o drugacijem pristupu u ASP.NET ili treba mozda nesto da se setuje. U VB6 je bilo ono setovanje u Tool Options:
To je do VS-a. Ne znam da li su iste kontrole za VB kao za C# okruzenje ali ako jesu - onda koristi F11 za Step into a F10 za Step Over.
[ oggie @ 14.12.2006. 12:17 ] @
Hvala na odgovoru, ne ljutim se i vise puta sam naglasio da sam pocetnik. Naravno da citam MSDN, forume i ostalo...ali imam i konkretan zadatak koji moram da uradim u kratkom vremenu, pa nemam bas vremena za ucenje, nego radim sve onako u hodu, kako mi naidje problem ja postujem pitanje, pa sam malo citam, trazim....pa nekako dodjem do resenja.
Hvala jos jednom svima na pomoci
p.s. Moram da priznam da mi nije najjasnije "Zato je najbolje da izbacis nanovo gresku(throw)" , gde da je izbacim ponovo i kako. Pokusacu da se iscupam iz ovoga.
[ negyxo @ 14.12.2006. 12:17 ] @
Citat: oggie:
Sto se tice tvojih saveta za .NET ja koristim VB jer ne znam C# mada vidim da se c# vise koristi. Vidim u C# kodu stalno MessageBox.Show pa se pitam jel to samo za c# ili postoji nesto i za VB ali ja ne znam?
Postoji i za VB. Mada se koristi i dalje MsgBox - za koji pretpostavljam da je ostavljen radi kompatibilnosti kao i ceo Microsoft.VisualBasic assembly.
[ negyxo @ 14.12.2006. 12:22 ] @
Bas si brz
Vec ti je bunker napisao code.
Code:
Try
.... neki code
Catch x As SqlException
Throw x
End Catch
[ oggie @ 14.12.2006. 12:28 ] @
Hvala, hvala, hvala......puuunoooo.
Hiljadu MSDN-ova ne moze da zameni ovakvu pomoc u pravom trenutku.
Znaci ono sto sam trazio je samo jedna jedina rec Throw x, u sve svoje funkcije u klasi sam stavio ovo i sad mi na formi puca cim naidje na gresku u klasi.
Kad znas onda je sve lako, a kad ne znas mozes dane i dane da izgubis zbog neke sitnice.
p.s. Sto se tice MessageBox u VB on ne radi, puca mi....a stari msgbox radi ali to je valjda na serverskoj strani poruka ne na klijentu.
[ oggie @ 14.12.2006. 12:39 ] @
Dugujem jedno izvinjenje Bunkeru, uopste nisam primetio njegov kod u okviru mog. Ja sam mislio da je samo citirao moj kod i citao sam samo odgovor ispod citata. Tek sad sam primetio da je dodavao kod u okviru citata.
Hvala i izvinjavam se na propustu, u zurbi sam pa mi je promaklo.
[ bunker @ 14.12.2006. 14:02 ] @
Nema problema. Samo citaj pazljivo...
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|