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 OutOfMemoryExceptionArgumentNullException 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, CommunicationExceptiona 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 CommunicationStatevlastnost . 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

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  2. Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.

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