Očekávané výjimky
Ukázka ExpectedExceptions ukazuje, jak zachytit očekávané výjimky při použití zadaného klienta. Tato ukázka vychází ze služby Začínáme , která implementuje službu kalkulačky. V této ukázce je klient konzolovou aplikací (.exe) a služba je hostovaná Internetová informační služba (IIS).
Poznámka:
Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.
Tato ukázka ukazuje zachycení a zpracování dvou očekávaných typů výjimek, které správné programy musí zpracovat: TimeoutException
a CommunicationException
.
Výjimky vyvolané metodami komunikace v klientovi WCF (Windows Communication Foundation) jsou buď očekávané, nebo neočekávané. Mezi neočekávané výjimky patří závažné selhání, jako jsou chyby programování, například OutOfMemoryException
ArgumentNullException
nebo InvalidOperationException
. Obvykle neexistuje žádný užitečný způsob, jak zpracovat neočekávané chyby, takže byste je obvykle neměli zachytit při volání metody komunikace klienta WCF.
Mezi očekávané výjimky z komunikačních metod klienta WCF patří TimeoutException
, CommunicationException
a všechny odvozené třídy CommunicationException
. To značí problém během komunikace, který je možné bezpečně zpracovat přerušením klienta WCF a hlášením selhání komunikace. Vzhledem k tomu, že externí faktory můžou způsobit tyto chyby v libovolné aplikaci, musí správné aplikace tyto výjimky zachytit a obnovit, když dojde k jejich výskytu.
Existuje několik odvozených CommunicationException
tříd, které může klient vyvolat. V některých případech aplikace také chytají některé z nich, aby udělaly speciální zpracování, ale nechat ostatní zpracovávat jako CommunicationException
. Toho lze dosáhnout zachycením konkrétnějšího typu výjimky a následným zachycením CommunicationException
v pozdější klauzuli catch-clause.
Kód, který volá metodu komunikace klienta, musí zachytit znak TimeoutException
a CommunicationException
. Jedním ze způsobů, jak tyto chyby vyřešit, je přerušit klienta a nahlásit selhání komunikace.
try
{
...
double result = client.Add(value1, value2);
...
client.Close();
}
catch (TimeoutException exception)
{
Console.WriteLine("Got {0}", exception.GetType());
client.Abort();
}
catch (CommunicationException exception)
{
Console.WriteLine("Got {0}", exception.GetType());
client.Abort();
}
Pokud dojde k očekávané výjimce, klient může nebo nemusí být následně použitelný. Pokud chcete zjistit, jestli je klient stále použitelný, zkontrolujte, zda State
je CommunicationState
vlastnost . Otevřít. Pokud je stále otevřený, je stále použitelný. Jinak byste měli klienta přerušit a uvolnit všechny odkazy na něj.
Upozornění
Můžete si všimnout, že klienti, kteří mají relaci, se po výjimce často nepoužívají a klienti, kteří relaci nemají, jsou po výjimce často stále použitelné. Žádná z těchto možností však není zaručená, takže pokud chcete pokračovat v používání klienta po výjimce, měla by aplikace zkontrolovat State
vlastnost, zda je klient stále otevřen.
Při spuštění ukázky se odpovědi na operace a výjimky zobrazí v okně konzoly klienta.
Proces klienta spouští dva scénáře, z nichž každý se pokusí volat Add
a následně Divide
. První scénář simuluje problém se sítí přerušením klienta před voláním Divide
. Druhý scénář způsobí podmínku časového limitu nastavením časového limitu příliš krátkého na dokončení metody. Očekávaný výstup z procesu klienta je následující:
Add(100,15.99) = 115.99
Simulated network problem occurs...
Got System.ServiceModel.CommunicationObjectAbortedException
Add(100,15.99) = 115.99
Set timeout too short for method to complete...
Got System.TimeoutException
Nastavení, sestavení a spuštění ukázky
Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.
Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.