Ausnahme- und Ausnahmeklassen

Im Allgemeinen ist eine Ausnahme eine ungewöhnliche Bedingung. Eine Ausnahme weist normalerweise auf Fehler hin, die jedoch manchmal absichtlich in das Programm eingefügt werden, z. B. wenn eine Prozedur vorzeitig beendet oder ein Ressourcenmangel behoben wird. Es gibt eine Reihe integrierter Ausnahmen, die auf Bedingungen wie das Lesen nach dem Ende einer Datei oder das Teilen durch Null hinweisen. Wir können unsere eigenen Ausnahmen definieren, die als benutzerdefinierte Ausnahmen bezeichnet werden.

Mit der Ausnahmebehandlung können Sie Fehler ordnungsgemäß behandeln und etwas Sinnvolles dagegen tun. Die Ausnahmebehandlung besteht aus zwei Komponenten: "Werfen" und "Fangen".

Ausnahme identifizieren (Fehler)

Jeder Fehler, der in Python auftritt, führt zu einer Ausnahme, die eine Fehlerbedingung darstellt, die durch ihren Fehlertyp identifiziert wird.

>>> #Exception
>>> 1/0
Traceback (most recent call last):
   File "<pyshell#2>", line 1, in <module>
      1/0
ZeroDivisionError: division by zero
>>>
>>> var = 20
>>> print(ver)
Traceback (most recent call last):
   File "<pyshell#5>", line 1, in <module>
      print(ver)
NameError: name 'ver' is not defined
>>> #Above as we have misspelled a variable name so we get an NameError.
>>>
>>> print('hello)

SyntaxError: EOL while scanning string literal
>>> #Above we have not closed the quote in a string, so we get SyntaxError.
>>>
>>> #Below we are asking for a key, that doen't exists.
>>> mydict = {}
>>> mydict['x']
Traceback (most recent call last):
   File "<pyshell#15>", line 1, in <module>
      mydict['x']
KeyError: 'x'
>>> #Above keyError
>>>
>>> #Below asking for a index that didn't exist in a list.
>>> mylist = [1,2,3,4]
>>> mylist[5]
Traceback (most recent call last):
   File "<pyshell#20>", line 1, in <module>
      mylist[5]
IndexError: list index out of range
>>> #Above, index out of range, raised IndexError.

Ausnahme beim Fangen / Fangen

Wenn in Ihrem Programm etwas Ungewöhnliches auftritt und Sie es mithilfe des Ausnahmemechanismus behandeln möchten, lösen Sie eine Ausnahme aus. Die Schlüsselwörter try und Except werden verwendet, um Ausnahmen abzufangen. Immer wenn innerhalb eines try-Blocks ein Fehler auftritt, sucht Python nach einem passenden Ausnahmeblock, um ihn zu behandeln. Wenn es eine gibt, springt die Ausführung dorthin.

Syntax

try:
   #write some code
   #that might throw some exception
except <ExceptionType>:
   # Exception handler, alert the user

Der Code in der try-Klausel wird Anweisung für Anweisung ausgeführt.

Wenn eine Ausnahme auftritt, wird der Rest des try-Blocks übersprungen und die Except-Klausel ausgeführt.

try:
   some statement here
except:
   exception handling

Schreiben wir einen Code, um zu sehen, was passiert, wenn Sie keinen Fehlerbehandlungsmechanismus in Ihrem Programm verwenden.

number = int(input('Please enter the number between 1 & 10: '))
print('You have entered number',number)

Das obige Programm funktioniert ordnungsgemäß, solange der Benutzer eine Nummer eingibt. Was passiert jedoch, wenn der Benutzer versucht, einen anderen Datentyp (z. B. eine Zeichenfolge oder eine Liste) einzugeben?

Please enter the number between 1 > 10: 'Hi'
Traceback (most recent call last):
   File "C:/Python/Python361/exception2.py", line 1, in <module>
      number = int(input('Please enter the number between 1 & 10: '))
ValueError: invalid literal for int() with base 10: "'Hi'"

Jetzt ist ValueError ein Ausnahmetyp. Versuchen wir, den obigen Code mit Ausnahmebehandlung neu zu schreiben.

import sys

print('Previous code with exception handling')

try:
   number = int(input('Enter number between 1 > 10: '))

except(ValueError):
   print('Error..numbers only')
   sys.exit()

print('You have entered number: ',number)

Wenn wir das Programm ausführen und eine Zeichenfolge (anstelle einer Zahl) eingeben, sehen wir, dass wir ein anderes Ergebnis erhalten.

Previous code with exception handling
Enter number between 1 > 10: 'Hi'
Error..numbers only

Ausnahmen auslösen

Um Ihre Ausnahmen von Ihren eigenen Methoden auszulösen, müssen Sie das Schlüsselwort raise wie folgt verwenden

raise ExceptionClass(‘Some Text Here’)

Nehmen wir ein Beispiel

def enterAge(age):
   if age<0:
      raise ValueError('Only positive integers are allowed')
   if age % 2 ==0:
      print('Entered Age is even')
   else:
      print('Entered Age is odd')

try:
   num = int(input('Enter your age: '))
   enterAge(num)
except ValueError:
   print('Only positive integers are allowed')

Führen Sie das Programm aus und geben Sie eine positive Ganzzahl ein.

Erwartete Ausgabe

Enter your age: 12
Entered Age is even

Aber wenn wir versuchen, eine negative Zahl einzugeben, erhalten wir:

Erwartete Ausgabe

Enter your age: -2
Only positive integers are allowed

Benutzerdefinierte Ausnahmeklasse erstellen

Sie können eine benutzerdefinierte Ausnahmeklasse erstellen, indem Sie die BaseException-Klasse oder die Unterklasse von BaseException erweitern.

Aus dem obigen Diagramm können wir ersehen, dass sich die meisten Ausnahmeklassen in Python von der BaseException-Klasse erstrecken. Sie können Ihre eigene Ausnahmeklasse aus der BaseException-Klasse oder ihrer Unterklasse ableiten.

Erstellen Sie eine neue Datei mit dem Namen NegativeNumberException.py und schreiben Sie den folgenden Code.

class NegativeNumberException(RuntimeError):
   def __init__(self, age):
      super().__init__()
      self.age = age

Der obige Code erstellt eine neue Ausnahmeklasse mit dem Namen NegativeNumberException, die nur aus einem Konstruktor besteht, der den übergeordneten Klassenkonstruktor mit super () __ init __ () aufruft und das Alter festlegt.

Um nun Ihre eigene benutzerdefinierte Ausnahmeklasse zu erstellen, schreiben Sie Code und importieren die neue Ausnahmeklasse.

from NegativeNumberException import NegativeNumberException
def enterage(age):
   if age < 0:
      raise NegativeNumberException('Only positive integers are allowed')

   if age % 2 == 0:
      print('Age is Even')

   else:
      print('Age is Odd')

try:
   num = int(input('Enter your age: '))
   enterage(num)
except NegativeNumberException:
   print('Only positive integers are allowed')
except:
   print('Something is wrong')

Ausgabe

Enter your age: -2
Only positive integers are allowed

Eine andere Möglichkeit, eine benutzerdefinierte Ausnahmeklasse zu erstellen.

class customException(Exception):
   def __init__(self, value):
      self.parameter = value

   def __str__(self):
      return repr(self.parameter)
try:
   raise customException('My Useful Error Message!')
except customException as instance:
   print('Caught: ' + instance.parameter)

Ausgabe

Caught: My Useful Error Message!

Ausnahmehierarchie

Die Klassenhierarchie für integrierte Ausnahmen lautet -

+-- SystemExit 
+-- KeyboardInterrupt 
+-- GeneratorExit 
+-- Exception 
+-- StopIteration 
+-- StopAsyncIteration 
+-- ArithmeticError 
| +-- FloatingPointError 
| +-- OverflowError 
| +-- ZeroDivisionError 
+-- AssertionError 
+-- AttributeError 
+-- BufferError 
+-- EOFError 
+-- ImportError 
+-- LookupError 
| +-- IndexError 
| +-- KeyError 
+-- MemoryError 
+-- NameError 
| +-- UnboundLocalError 
+-- OSError 
| +-- BlockingIOError 
| +-- ChildProcessError 
| +-- ConnectionError 
| | +-- BrokenPipeError 
| | +-- ConnectionAbortedError 
| | +-- ConnectionRefusedError 
| | +-- ConnectionResetError 
| +-- FileExistsError 
| +-- FileNotFoundError 
| +-- InterruptedError 
| +-- IsADirectoryError 
| +-- NotADirectoryError 
| +-- PermissionError 
| +-- ProcessLookupError 
| +-- TimeoutError 
+-- ReferenceError 
+-- RuntimeError 
| +-- NotImplementedError 
| +-- RecursionError 
+-- SyntaxError 
| +-- IndentationError
| +-- TabError 
+-- SystemError 
+-- TypeError 
+-- ValueError 
| +-- UnicodeError 
| +-- UnicodeDecodeError 
| +-- UnicodeEncodeError 
| +-- UnicodeTranslateError 
+-- Warning 
+-- DeprecationWarning 
+-- PendingDeprecationWarning 
+-- RuntimeWarning 
+-- SyntaxWarning 
+-- UserWarning 
+-- FutureWarning 
+-- ImportWarning 
+-- UnicodeWarning 
+-- BytesWarning 
+-- ResourceWarning