8.3 Python 中的异常处理结构

8.3.1 tyr...except 结构

      结构语法。

tyr:
  try 块
except Exception[as reason]:
  except 块

      如果需要捕获所有类型的异常,可以使用 BaseException。

try:
  ...
except BaseException as e:
  except 块

      一般不建议像上面这样做,一般建议尽量显示捕获所有可能出现的异常。
      代码演示。

>>> while True:
    try:
        x = int(input("Please enter a number:"))
        break
    except ValueError:
        print("That was not a valid number, Try again...")

        
Please enter a number:e
That was not a valid number, Try again...
Please enter a number:ad
That was not a valid number, Try again...
Please enter a number:8i
That was not a valid number, Try again...
Please enter a number:9f
That was not a valid number, Try again...
Please enter a number:12

      可以在 except 子句异常类后面指定一个变量,用来捕获异常的参数或更详细的信息。

>>> try:
    raise Exception('spam', 'eggs')
except Exception as inst:
    print(type(inst))
    print(inst.args)
    print(inst)
    x, y = inst.args
    print('x=',x)
    print('y=',y)

    
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x= spam
y= eggs

8.3.2 try...except...else 结构

      如果 try 中的代码没有抛出任何异常,则执行 else 块中的代码。

>>> while True:
    n = input('请输入字符串序号')
    try:
        n = int(n)
        print(a_list[n])
    except IndexError:
        print('列表下标不正确,请重新输入')
    else:
        break

8.3.3 带有多个 except 的 try 结构

      一旦某个 except 捕获了异常,则后面剩余的 except 子句将不会再执行。

>>> try:
    x = input('请输入被除数')
    y = input('请输入除数')
    z = float(x) / float(y)
except ZeroDivisionError:
    print('除数不能为0')
except TypeError:
    print('被除数和除数应为数值类型')
except NameError:
    print('变量不存在')
else:
    print(x, ' / ', y, ' = ', z)

8.3.4 try...except...finally 结构

      finally 子句的语句块无论是否发生异常都会执行,常用来做一些清理工作和释放资源。

>>> try:
    3/0
except:
    print(3)
finally:
    print(5)

    
3
5

      再比如下面代码,无论读取文件是否发生异常,总是能够正常关闭文件。

>>> try:
    f = open('sample.txt', 'r')
    line = f.readline()
    print(line)
finally:
    f.close()

    
中国山东烟台 SDIBT

      如果 try 子句的异常没有被捕获和处理,或者 except 子句或 else 子句 发生了异常,那这些异常会在 finally 子句执行完后再次抛出。

>>> def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result = ", result)
    finally:
        print("executing finally clause")

        
>>> divide(2, 1)
result =  2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
TypeError: unsupported operand type(s) for /: 'str' and 'str'

      另外,finally 子句也会发生异常。

>>> try:
    f = open('sample.txt', 'r')
    line = f.readline()
    print(line)
finally:
    F.close()

    
中国山东烟台 SDIBT

Traceback (most recent call last):
  File "<pyshell#80>", line 6, in <module>
    F.close()
NameError: name 'F' is not defined

      应避免在 finally 子句中使用 return 语句。

>>> def demo_div(a, b):
    try:
        return a / b
    except:
        pass
    finally:
        return -1

    
>>> demo_div(1, 0)
-1
>>> demo_div(1, 2)
-1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容