Iznimke su pogreške koje se javljaju tijekom izvođenja; rukovanje iznimkama je tehnika rukovanja tim pogreškama u izvođenju. Za rukovanje iznimkama obično upotrebljavate blokove try, catch i konačno (također poznati kao blokovi iznimki) u kodu svoje aplikacije. Ako se izuzeci ne postupaju ispravno u kodu aplikacije, a izuzetak se dogodi tijekom izvođenja, izvršenje aplikacije će se prekinuti.
Rukovanje iznimkama u WCF-u nije tako izravno - ograničeni ste na slanje .Net objekata putem žice i vaša WCF usluga može klijentu slati samo serializirane podatke, tj. SOAP poruke. S iznimkama u WCF-u možete se nositi na jedan od ova tri načina:
- Korištenje FaultException
- Korištenje IErrorHandler
- Korištenje returnUnknownExceptionsAsFaults
U ovom postu predstavit ću raspravu o različitim načinima na koje se poruke o iznimkama mogu prenijeti iz WCF usluge potrošačima usluge.
Razmotrite ovu jednostavnu WCF uslugu.
[Uslužni ugovor]
javno sučelje IDBManagerService
{
[OperationContract]
void Spremi (zaposlenik emp);
}
Ugovor o usluzi IDBManagerService sadrži jedan operativni ugovor za zadržavanje objekta zaposlenika u bazi podataka.
javna klasa DBManagerService: IDBManagerService
{
void Spremi (zaposlenik emp)
{
probati
{
// Kôd za spremanje objekta zaposlenika u bazu podataka
}
ulov (izuzetak ex)
{
izbaci novu iznimku ("Došlo je do pogreške prilikom spremanja podataka ...");
}
}
}
Pretpostavimo sada da postoji pogreška prilikom povezivanja s bazom podataka ili spremanja objekta zaposlenika u bazu podataka u trenutku kada pokušavate konzumirati uslugu. Tada biste dobili iznimku s ovom porukom: "System.ServiceModel.FaultException: Poslužitelj nije uspio obraditi zahtjev zbog interne pogreške. Za više informacija o pogrešci uključite IncludeExceptionDetailInFaults (bilo iz ServiceBehaviorAttribute ili iz konfiguracije ponašanje) na poslužitelju kako bi klijentu poslali informacije o iznimci ili uključili praćenje prema Microsoft .Net Framework 3.0 SDK dokumentaciji i pregledali zapisnike praćenja poslužitelja. "
Možete koristiti postaviti element includeExceptionDetailInFaults na true u datoteci web.config tako da su dodatni detalji iznimke uključeni u grešku kako bi vam bilo jednostavnije pregledati što je zapravo pošlo po zlu.
To možete postići i pisanjem koda. Ovdje je isječak koda koji ilustrira kako ovo svojstvo možete postaviti na true.
typeof (ServiceDebugBehavior));
novi ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});
To također možete postaviti na true pomoću oznake ServiceBehavior, kao što je prikazano u nastavku.
[ServiceBehavior (IncludeExceptionDetailInFaults = true)]
javna klasa DBManagerService: IDBManagerService
{
}
Kad ponovno pokušate potrošiti uslugu, vidjet ćete precizniju poruku o iznimci.
Korištenje FaultException
Međutim, ako trebate proslijediti korisničke poruke o iznimkama iz usluge, trebali biste izbaciti iznimke grešaka. Iznimke grešaka su iznimke koje dobaci WCF usluga kada se iznimka dogodi tijekom izvođenja - takve se iznimke obično koriste za prijenos netipiziranih podataka o greškama potrošačima usluge. Možete postupati s iznimkama u svojim metodama usluge na sličan način kao i s drugim metodama, a zatim ih pretvoriti u iznimke grešaka.
Isječak koda u nastavku prikazuje ažuriranu metodu usluge - metoda usluge sada baca iznimku greške.
javna klasa DBManagerService: IDBManagerService
{
void Spremi (zaposlenik emp)
{
probati
{
// Kôd za spremanje objekta zaposlenika u bazu podataka
}
ulov (izuzetak ex)
{
baciti novi FaultException ("Došlo je do pogreške prilikom spremanja podataka ...");
}
}
}
Sada biste trebali tretirati iznimku kvara u svom kodu kada trošite ovu uslugu. Iz ovog MSDN-ovog članka možete saznati više o iznimkama kvara u WCF-u.
Također možete stvoriti prilagođenu klasu kvara koja je označena atributom DataContract.
[DataContract]
javna klasa CustomFault
{
[Član podataka]
javni niz Izvor;
[Član podataka]
javni niz ExceptionMessage;
[Član podataka]
javni niz InnerException;
[Član podataka]
javni niz StackTrace;
}
Sljedeći isječak koda ilustrira kako možete koristiti klasu CustomFault za bacanje snažno otkucanih FaultException.
void Spremi (zaposlenik emp)
{
probati
{
// Kôd za spremanje objekta zaposlenika u bazu podataka
}
ulov (izuzetak ex)
{
CustomFault cx = novi CustomFault ();
baciti novi FaultException (npr. novi FaultReason ("Ovo je snažno otkucana iznimka s greškom"));
}
}
Također biste trebali navesti atribut FaultContract na svojoj metodi usluge koji bi podigao FaultException. Izmijenjena metoda Spremi izgledala bi ovako.
[Uslužni ugovor]
javno sučelje IDBManagerService
{
[OperationContract]
[FaultContract]
void Spremi (zaposlenik emp);
}
Korištenje returnUnknownExceptionsAsFaults
Atribut returnUnknownExceptionsAsFaults možete koristiti u konfiguraciji ponašanja usluge da biste automatski pokrenuli iznimku kao SOAP grešku. Sljedeći isječak koda ilustrira kako to možete postići.
returnUnknownExceptionsAsFaults = "True">
Rukovanje iznimkama globalno
Drugi način za rukovanje iznimkama u WCF-u je implementacija sučelja IErrorHandler na vašoj uslužnoj klasi za globalno rukovanje svim iznimkama i pružanje FaultException kompatibilnog sa SOAP-om. Ovo sučelje sadrži dvije metode - HandleError i ProvideFault. Dok se prvi koristi za izvođenje neke aktivnosti s pogreškom, drugi se koristi za vraćanje poruke o pogrešci. Imajte na umu da IErrorHandler možete konfigurirati (uključiti ili isključiti) u datoteci koju je moguće konfigurirati.