详解在Python中处理异常的教程
什么是异常? 异常是一个事件,其中一个程序,破坏程序的指令的正常流的执行过程中而发生的。一般情况下,当一个Python脚本遇到一些情况不能处理,就抛出一个异常。异常是一个Python对象,它表示一个错误。 当Python脚本抛出一个异常,它必须处理异常,否则将立即终止。 如果有可能会引发异常的一些可疑的代码,就可以通过将可疑的代码在一个try块:保卫你的程序。在try块,包括以下情况except:语句,其次是代码,作为优雅的处理问题,尽可能块。 这里是try....except...else 块的简单语法: try: You do your operations here; ...................... except ExceptionI: If there is ExceptionI,then execute this block. except ExceptionII: If there is ExceptionII,then execute this block. ...................... else: If there is no exception then execute this block. 这里有一些关于上述语法要点:
例子 这里是简单的例子,这将打开一个文件并写入内容的文件中并移出正常: #!/usr/bin/python try: fh = open("testfile","w") fh.write("This is my test file for exception handling!!") except IOError: print "Error: can't find file or read data" else: print "Written content in the file successfully" fh.close() 这将产生以下结果: Written content in the file successfully 示例: 这里有一个更简单的例子,它试图打开没有权限并在文件中写入内容,所以它会引发一个异常: #!/usr/bin/python try: fh = open("testfile","r") fh.write("This is my test file for exception handling!!") except IOError: print "Error: can't find file or read data" else: print "Written content in the file successfully" 这将产生以下结果: Error: can't find file or read data 在except子句无异常: 还可以使用不同的定义如下无异常的声明: try: You do your operations here; ...................... except: If there is any exception,then execute this block. ...................... else: If there is no exception then execute this block. try-except 语句捕获所有出现的异常。使用这种try-except 声明不被认为是一个良好的编程习惯,但因为它捕获所有异常,但不会使程序员找出可能出现的问题的根本原因。 也可以使用相同的除语句来处理多个异常,如下所示: try: You do your operations here; ...................... except(Exception1[,Exception2[,...ExceptionN]]]): If there is any exception from the given exception list,then execute this block. ...................... else: If there is no exception then execute this block. try-finally 语句: 可以使用finally:块连同try:块。在try块是否引发异常或没有任何代码 finally块是一个必须执行的块。try-finally语句的语法是这样的: try: You do your operations here; ...................... Due to any exception,this may be skipped. finally: This would always be executed. ...................... 请注意,可以提供except子句或finally子句,但不能同时使用。不能同时使用else子句与finally子句。 #!/usr/bin/python try: fh = open("testfile","w") fh.write("This is my test file for exception handling!!") finally: print "Error: can't find file or read data" 如果没有权限,以写入方式打开文件,那么这将产生以下结果: Error: can't find file or read data 同样的例子可以写入更简洁,如下所示: #!/usr/bin/python try: fh = open("testfile","w") try: fh.write("This is my test file for exception handling!!") finally: print "Going to close the file" fh.close() except IOError: print "Error: can't find file or read data" 当一个异常被抛出在try块中,执行立即传递到finally块。finally块中的所有语句都执行,该异常被再次抛出,并在被处理 except 语句如果出现在一个更高的层在try-except语句。 异常可以有一个参数,参数是一个值,它给出了关于这个问题的其他信息。参数按异常内容改变。可以通过不同的子句提供一个变量,如下所示捕获异常的参数: try: You do your operations here; ...................... except ExceptionType,Argument: You can print value of Argument here... 如果正在编写代码来处理一个异常,可以有一个变量按照异常的名称在不同的声明。如果捕捉多个异常,可以有一个变量按照异常的元组。 这个变量将接收主要包含异常原因的异常值。该变量可以在一个元组的形式接收一个或多个值。该元组通常包含错误串,错误码和一个错误的位置。 下面是一个异常的例子: #!/usr/bin/python # Define a function here. def temp_convert(var): try: return int(var) except ValueError,Argument: print "The argument does not contain numbersn",Argument # Call above function here. temp_convert("xyz"); 这将产生以下结果: The argument does not contain numbers invalid literal for int() with base 10: 'xyz' 抛出异常: 可以通过使用raise语句抛出几个方面的异常。一般raise语句的语法。 raise [Exception [,args [,traceback]]] 这里,Exception是异常的类型(例如,NameError)和参数是用于异常的参数值。该参数是可选的;如果未提供,则异常的参数是None。 最后一个参数traceback,也是可选的(并且在实践中很少使用),并且如果存在的话,那么用于异常回溯对象。 异常可以是一个字符串,一个类或一个对象。大多数Python核心抛出是类,有参数认为是类的实例的异常。定义新的异常是很容易的,可以参考如下: def functionName( level ): if level < 1: raise "Invalid level!",level # The code below to this would not be executed # if we raise the exception 注:为了捕获一个异常,“except”语句必须引用抛出类对象或简单的字符串相同的异常。例如,捕捉到上面的异常,必须写except子句,如下所示: try: Business Logic here... except "Invalid level!": Exception handling here... else: Rest of the code here... 用户定义的异常: Python中,还可以通过内置的异常标准的派生类来创建自己的异常。 下面是有关RuntimeError一个例子。这里是从RuntimeError子类的类被创建。当需要显示更多的具体信息时,一个异常被捕获,这是很有用的。 在try块中,用户定义的异常引发,并夹在except块。变量e被用来创建类Networkerror的一个实例。 class Networkerror(RuntimeError): def __init__(self,arg): self.args = arg 所以一旦在上面定义的类,可以按如下方法抛出异常: try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |