Izjeme so napake, ki se pojavijo med izvajanjem; ravnanje z izjemami je tehnika obdelave teh napak pri izvajanju. Za obdelavo izjem običajno uporabljate bloke try, catch in nazadnje (znani tudi kot bloki izjem) v kodi aplikacije. Če izjeme v kodi aplikacije niso pravilno obdelane in je med izvajanjem prišlo do izjeme, bi se izvajanje aplikacije končalo.
Ravnanje z izjemami v WCF ni tako enostavno - omejitev pošiljanja objektov .Net je prek žice in vaša storitev WCF lahko odjemalcu pošilja samo serializirane podatke, tj. Sporočila SOAP. Izjeme v WCF lahko obravnavate na enega od teh treh načinov:
- Uporaba FaultException
- Uporaba IErrorHandler
- Uporaba returnUnknownExceptionsAsFaults
V tem prispevku bom predstavil razpravo o različnih načinih prenosa sporočil o izjemah iz storitve WCF potrošnikom storitve.
Razmislite o tej preprosti storitvi WCF.
[ServiceContract]
javni vmesnik IDBManagerService
{
[OperationContract]
void Save (Zaposleni emp);
}
Pogodba o storitvi IDBManagerService vsebuje eno operacijsko pogodbo za ohranitev predmeta zaposlenega v bazi podatkov.
javni razred DBManagerService: IDBManagerService
{
void Save (Zaposleni emp)
{
poskusite
{
// Koda za shranjevanje predmeta zaposlenega v bazo podatkov
}
ulov (izjema ex)
{
vrzi novo izjemo (»Napaka pri shranjevanju podatkov…«);
}
}
}
Zdaj predpostavimo, da je prišlo do napake pri povezovanju z bazo podatkov ali shranjevanju predmeta zaposlenega v bazo podatkov, ko poskušate uporabiti storitev. Nato bi dobili izjemo s tem sporočilom: "System.ServiceModel.FaultException: Strežnik zaradi notranje napake ni mogel obdelati zahteve. Če želite več informacij o napaki, vklopite IncludeExceptionDetailInFaults (bodisi iz ServiceBehaviorAttribute bodisi iz konfiguracije vedenje) na strežniku, da stranki pošlje informacije o izjemi nazaj ali vklopi sledenje v skladu z dokumentacijo Microsoft .Net Framework 3.0 SDK in pregleda dnevnike sledenja strežnika. "
V datoteki web.config lahko nastavite element includeExceptionDetailInFaults na true, tako da so v napako vključene dodatne podrobnosti izjeme, da boste lažje pregledali, kaj je dejansko šlo narobe.
To lahko dosežete tudi s pisanjem kode. Tu je delček kode, ki ponazarja, kako lahko to lastnost nastavite na true.
typeof (ServiceDebugBehavior));
novo ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});
To lahko nastavite tudi na true z uporabo oznake ServiceBehavior, kot je prikazano spodaj.
[ServiceBehavior (IncludeExceptionDetailInFaults = true)]
javni razred DBManagerService: IDBManagerService
{
}
Ko poskusite znova uporabiti storitev, boste videli natančnejše sporočilo o izjemi.
Uporaba FaultException
Če morate storitvi poslati uporabniku prijazna sporočila o izjemah, vrzite izjeme o napakah. Izjeme napak so izjeme, ki jih storitev WCF sproži, kadar pride do izjeme med izvajanjem - takšne izjeme se običajno uporabljajo za prenos netipiziranih podatkov o napakah potrošnikom storitve. Izjeme lahko v svojih servisnih metodah obravnavate enako kot pri drugih metodah in jih nato spremenite v izjeme napak.
Spodnji delček kode prikazuje posodobljeno metodo storitve - metoda storitve zdaj vrne izjemo napake.
javni razred DBManagerService: IDBManagerService
{
void Save (Zaposleni emp)
{
poskusite
{
// Koda za shranjevanje predmeta zaposlenega v bazo podatkov
}
ulov (izjema ex)
{
vrzi novo FaultException (»Napaka pri shranjevanju podatkov…«);
}
}
}
Zdaj bi morali pri uporabi te storitve obravnavati izjeme napak v svoji kodi. Več o izjemah napak v WCF lahko izveste v tem članku MSDN.
Ustvarite lahko tudi razred napak po meri, ki je označen z atributom DataContract.
[DataContract]
javni razred CustomFault
{
[DataMember]
javni niz Vir;
[DataMember]
javni niz ExceptionMessage;
[DataMember]
javni niz InnerException;
[DataMember]
javni niz StackTrace;
}
Naslednji delček kode prikazuje, kako lahko uporabite razred CustomFault za metanje močno vtipkanega FaultException.
void Save (Zaposleni emp)
{
poskusite
{
// Koda za shranjevanje predmeta zaposlenega v bazo podatkov
}
ulov (izjema ex)
{
CustomFault cx = novo CustomFault ();
vrzi novo FaultException (npr. nova FaultReason ("To je močno vtipkana izjema z napako"));
}
}
Prav tako bi morali v metodi storitve določiti atribut FaultContract, ki bi povzročil FaultException. Spremenjena metoda Save bi izgledala takole.
[ServiceContract]
javni vmesnik IDBManagerService
{
[OperationContract]
[FaultContract]
void Save (Zaposleni emp);
}
Uporaba returnUnknownExceptionsAsFaults
Atribut returnUnknownExceptionsAsFaults lahko uporabite v konfiguraciji vedenja storitve, da samodejno sprožite izjemo kot napako SOAP. Naslednji delček kode prikazuje, kako lahko to dosežete.
returnUnknownExceptionsAsFaults = "True">
Globalno ravnanje z izjemami
Drug način za obvladovanje izjem v WCF je z uporabo vmesnika IErrorHandler v vašem servisnem razredu za globalno obdelavo vseh izjem in zagotavljanje FaultException, skladnega s SOAP. Ta vmesnik vsebuje dve metodi - HandleError in ProvideFault. Medtem ko se prvi uporablja za izvajanje neke dejavnosti z napako, se drugi uporablja za vrnitev sporočila o napaki. Upoštevajte, da lahko tudi IErrorHandler konfigurirate (vklopite ali izklopite) v datoteki, ki jo je mogoče konfigurirati.