📜  Python异常处理

📅  最后修改于: 2020-10-24 09:20:15             🧑  作者: Mango

Python异常

可以将异常定义为程序中的异常情况,导致程序流程中断。

每当发生异常时,程序都会停止执行,因此不会执行其他代码。因此,例外是无法处理Python脚本的运行时错误。异常是表示错误的Python对象

Python提供了一种处理异常的方法,以便可以在不中断的情况下执行代码。如果我们不处理该异常,则解释器不会执行该异常之后存在的所有代码。

Python具有许多内置的异常,这些异常使我们的程序能够运行而不会中断并提供输出。这些例外情况如下:

常见例外

Python提供了许多内置的异常,但是在这里我们描述了常见的标准异常。下面列出了可以从标准Python程序抛出的常见异常列表。

  • ZeroDivisionError:在数字除以零时发生。
  • NameError:当找不到名称时发生。它可以是本地的或全局的。
  • IndentationError:如果缩进不正确。
  • IOError:输入输出操作失败时发生。
  • EOFError:到达文件末尾但仍在执行操作时发生。

没有处理异常的问题

正如我们已经讨论的那样,异常是一种异常情况,会中断程序的执行。

假设我们有两个变量a和b,它们接受用户的输入并执行这些值的除法。如果用户输入零作为分母怎么办?它将通过ZeroDivision异常中断程序执行。让我们看下面的例子。

a = int(input("Enter a:"))  
b = int(input("Enter b:"))  
c = a/b
print("a/b = %d" %c)  
  
#other code:  
print("Hi I am other part of the program")

输出:

Enter a:10
Enter b:0
Traceback (most recent call last):
  File "exception-test.py", line 3, in 
    c = a/b;
ZeroDivisionError: division by zero

上面的程序在语法上是正确的,但由于输入异常而导致错误。这种编程可能不适合或不建议用于项目,因为这些项目需要不间断地执行。这就是为什么异常处理在处理这些意外异常方面起着至关重要的作用。我们可以通过以下方式处理这些异常。

Python的异常处理

try-expect语句

如果Python程序包含可能引发异常的可疑代码,则必须将该代码放在try块中。 try块之后必须带有except语句,该语句包含一个代码块,如果try块中有异常,该代码块将被执行。

句法

try:  
    #block of code   
  
except Exception1:  
    #block of code  
  
except Exception2:  
    #block of code  
  
#other code  

考虑以下示例。

例子1

try:
    a = int(input("Enter a:"))  
    b = int(input("Enter b:"))  
    c = a/b
except:
    print("Can't divide with zero")

输出:

Enter a:10
Enter b:0
Can't divide with zero

我们还可以将else语句与try-except语句一起使用,如果没有异常发生在try块中,我们可以将要在场景中执行的代码放在其中。

下面给出了将else语句与try-except语句结合使用的语法。

try:  
    #block of code   
  
except Exception1:  
    #block of code   
  
else:  
    #this code executes if no except block is executed  

考虑下面的程序。

例子2

try:  
    a = int(input("Enter a:"))  
    b = int(input("Enter b:"))  
    c = a/b
    print("a/b = %d"%c)  
# Using Exception with except statement. If we print(Exception) it will return exception class
except Exception:  
    print("can't divide by zero")  
    print(Exception)
else:  
    print("Hi I am else block")   

输出:

Enter a:10
Enter b:0
can't divide by zero

例外的except语句

Python提供了不使用异常语句指定异常名称的灵活性。

考虑以下示例。

try:  
    a = int(input("Enter a:"))  
    b = int(input("Enter b:"))  
    c = a/b;  
    print("a/b = %d"%c)  
except:  
    print("can't divide by zero")  
else:  
    print("Hi I am else block")   

与异常变量一起使用的except语句

我们可以将exception变量与except语句一起使用。通过使用as关键字来使用它。该对象将返回异常原因。考虑以下示例:

try:  
    a = int(input("Enter a:"))  
    b = int(input("Enter b:"))  
    c = a/b
    print("a/b = %d"%c)  
    # Using exception object with the except statement
except Exception as e:  
    print("can't divide by zero")  
    print(e)
else:  
    print("Hi I am else block")   

输出:

Enter a:10
Enter b:0
can't divide by zero
division by zero

要记住的要点

  • Python方便我们不使用except语句指定异常。
  • 我们可以在except语句中声明多个异常,因为try块可能包含引发不同类型异常的语句。
  • 我们还可以指定一个else块以及try-except语句,如果try块中没有引发异常,则将执行该语句。
  • 不引发异常的语句应放在else块内。

try:  
    #this will throw an exception if the file doesn't exist.   
    fileptr = open("file.txt","r")  
except IOError:  
    print("File not found")  
else:  
    print("The file opened successfully")  
    fileptr.close()  

输出:

File not found

声明多个异常

Python允许我们使用except子句声明多个异常。在try块引发多个异常的情况下,声明多个异常非常有用。语法如下。

句法

try:  
    #block of code   
  
except (,,,...)  
    #block of code   
  
else:  
    #block of code  

考虑以下示例。

try:    
    a=10/0;    
except(ArithmeticError, IOError):    
    print("Arithmetic Exception")    
else:    
    print("Successfully Done")     

输出:

Arithmetic Exception

尝试…最终阻止

Python提供了可选的finally语句,该语句与try语句一起使用。无论发生什么异常,它都会被执行并用于释放外部资源。 finally块提供了执行保证。

我们可以将finally块与try块一起使用,在其中可以调整必要的代码,这些代码必须在try语句引发异常之前执行。

下面给出了使用finally块的语法。

句法

try:  
    # block of code   
    # this may throw an exception  
finally:  
    # block of code  
    # this will always be executed   

try:  
    fileptr = open("file2.txt","r")    
    try:  
        fileptr.write("Hi I am good")  
    finally:  
        fileptr.close()  
        print("file closed")  
except:  
    print("Error")  

输出:

file closed
Error

引发异常

通过使用Python的raise子句可以强制引发异常。在需要引发异常以停止程序执行的情况下,此方法很有用。

例如,有一个程序需要2GB的内存才能执行,如果该程序试图占用2GB的内存,则我们可以引发异常以停止程序的执行。

下面给出了使用raise语句的语法。

句法

raise Exception_class,  

要记住的要点

  • 要引发异常,请使用raise语句。异常类名称紧随其后。
  • 可以为异常提供可以在括号中给出的值。
  • 要访问值“ as “,使用关键字。 “ e “用作存储异常值的参考变量。
  • 我们可以将值传递给异常以指定异常类型。

try:  
    age = int(input("Enter the age:"))  
    if(age<18):  
        raise ValueError 
    else:  
        print("the age is valid")  
except ValueError:  
    print("The age is not valid")  

输出:

Enter the age:17
The age is not valid

示例2:使用消息引发异常

try:
     num = int(input("Enter a positive integer: "))
     if(num <= 0):
# we can pass the message in the raise statement
         raise ValueError("That is  a negative number!")
except ValueError as e:
     print(e)

输出:

Enter a positive integer: -5
That is a negative number!

例子3

try:  
    a = int(input("Enter a:"))  
    b = int(input("Enter b:"))  
    if b is 0:  
        raise ArithmeticError
    else:  
        print("a/b = ",a/b)  
except ArithmeticError:  
    print("The value of b can't be 0")

输出:

Enter a:10
Enter b:0
The value of b can't be 0

自订例外

Python允许我们创建可以从程序中引发并使用except子句捕获的异常。但是,建议您在访问Python对象和类之后阅读本节。

考虑以下示例。

class ErrorInCode(Exception):    
    def __init__(self, data):    
        self.data = data    
    def __str__(self):    
        return repr(self.data)    
    
try:    
    raise ErrorInCode(2000)    
except ErrorInCode as ae:    
    print("Received error:", ae.data)    

输出: