Vytváření a výjimky (Příručka programování C#)
Výjimky jsou použity k označení, že při spouštění programu došlo k chybě.Jsou vytvořeny objekty výjimku, popisující chybu a pak vyvolaných s vyvoláním klíčové slovo.Runtime pak vyhledá nejvíce kompatibilní zpracování výjimek.
Programátoři vyvoláním výjimky při jednom platí nebo více z následujících podmínek:
Metoda nemůže dokončit jeho definované funkce.
Například parametr metody má neplatnou hodnotu:
static void CopyObject(SampleClass original) { if (original == null) { throw new System.ArgumentException("Parameter cannot be null", "original"); } }
Provedené nevhodné volání objektu na základě stavu objektu.
Jeden příklad může pokoušet zapsat do souboru jen pro čtení.V případech, kdy objekt stavu neumožňuje operace vyvolávají instanci InvalidOperationException nebo objekt na základě odvození této třídy.Toto je příklad metodu, která vyvolá InvalidOperationException objekt:
class ProgramLog { System.IO.FileStream logFile = null; void OpenLog(System.IO.FileInfo fileName, System.IO.FileMode mode) {} void WriteLog() { if (!this.logFile.CanWrite) { throw new System.InvalidOperationException("Logfile cannot be read-only"); } // Else write data to the log and return. } }
Pokud argument metody způsobí výjimku.
V tomto případě by původní výjimka zachycena a ArgumentException by měla být vytvořena instance.Původní výjimce byste měli předat konstruktoru ArgumentException jako InnerException parametr:
static int GetValueFromArray(int[] array, int index) { try { return array[index]; } catch (System.IndexOutOfRangeException ex) { System.ArgumentException argEx = new System.ArgumentException("Index is out of range", "index", ex); throw argEx; } }
Výjimky obsahovat vlastnost s názvem StackTrace.Tento řetězec obsahuje název metody na aktuální zásobník volání spolu s název a řádek číslo souboru kde nastala výjimka pro každou metodu.A StackTrace objekt je vytvořen automaticky modul common language runtime (CLR) od bodu throw prohlášení, aby výjimky musí být vyvolána z místa, kde má začít trasování zásobníku.
Všechny výjimky obsahovat vlastnost s názvem Message.Tento řetězec je třeba nastavit vysvětlit důvod pro výjimku.Všimněte si, že informace, které jsou citlivé na zabezpečení nesmí být uvedeno v textu.Kromě Message, ArgumentException obsahuje vlastnost s názvem ParamName , je třeba nastavit na název argumentu, který způsobil výjimku se vyvolá.Z vlastnost setter ParamName na value.
Členy veřejné a chráněné metody vyvoláním výjimky při každém jejich nelze dokončit jejich zamýšlené funkce.Třída výjimek, která je vyvolána by měla být nejvíce specifické výjimky k dispozici, který vyhovuje chybové podmínky.Tyto výjimky musí být zdokumentována jako součást funkce třídy a odvozené třídy nebo aktualizace původní třída by si měly zachovat stejné chování z důvodu zpětné kompatibility.
Způsoby předejít výjimky
Následující seznam uvádí postupy k zabránění výjimky:
Výjimky by nelze změnit tok programu jako součást běžné spuštění.Výjimky by měla sloužit pouze k hlášení a zpracovávají chybové stavy.
Nejsou k dispozici výjimky, jako návratová hodnota nebo parametr je vyvolána.
Není vyvolána System.Exception, System.SystemException, System.NullReferenceException, nebo System.IndexOutOfRangeException úmyslně ze zdrojového kódu.
Vytvořit výjimky, které může být vyvolána v režimu ladění, ale není uvolnění režimu.Chcete-li identifikovat chyby v průběhu fáze vývoje, použijte ladění výrazu.
Definice tříd výjimek
Programy lze vyvolat výjimku předdefinované třídy System oboru názvů (pokud již dříve uvedeno jinak), nebo vytvořit vlastní tříd výjimek vyplývajících z Exception.Odvozené třídy měly definovat nejméně čtyři konstruktory: jeden výchozí konstruktor, který nastaví vlastnost zprávy a který nastaví i Message a InnerException vlastnosti.Čtvrtý konstruktoru lze serializovat výjimku.Nové třídy výjimka by měla být serializovatelné.Příklad:
[Serializable()]
public class InvalidDepartmentException : System.Exception
{
public InvalidDepartmentException() : base() { }
public InvalidDepartmentException(string message) : base(message) { }
public InvalidDepartmentException(string message, System.Exception inner) : base(message, inner) { }
// A constructor is needed for serialization when an
// exception propagates from a remoting server to the client.
protected InvalidDepartmentException(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context) { }
}
Nové vlastnosti by pouze přidána třída výjimek je vhodné řešení s výjimkou údajů, které poskytují.Pokud jsou přidány nové vlastnosti třídy odvozené výjimku ToString() by měla být přepsána vrátit přidané informace.
Specifikace jazyka C#
Další informace naleznete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.
Viz také
Referenční dokumentace
Výjimky a zpracování výjimek (Příručka programování C#)
(C# Příručka programování) zpracování výjimek