笔记-python-tutorial-8.errors and exceptions

笔记-python-tutorial-8.errors and exceptions

1.      errors and exceptions

1.1.    syntax errors

>>> while True print('Hello world')

  File "<stdin>", line 1

    while True print('Hello world')

                   ^

SyntaxError: invalid syntax

1.2.    异常处理

>>> while True:

...     try:

...         x = int(input("Please enter a number: "))

...         break

...     except ValueError:

...         print("Oops!  That was no valid number.  Try again...")

...

try语句工作原理:

  1. 首先,执行try和except之间的语句;
  2. 如果没有异常出现,except语句后的内容不执行,try语句执行结束;
  3. 如果在执行第一步时出现异常,剩余语句将跳过;如果抛出的异常类型与except后的关键字匹配,except部分语句执行;
  4. 如果出现异常但不匹配except给出的关键字类型,except后的语句将跳过,异常被抛给更外围的try语句,如果没有任何try语句捕获该异常,则输出缺省的出错信息。

一个try可以有多个except部分。

... except (RuntimeError, TypeError, NameError):

...     pass

更好的写法,最后一个except语句最好不带异常名,这样它可以处理所有的异常信息。

import sys

try:

    f = open('myfile.txt')

    s = f.readline()

    i = int(s.strip())

except OSError as err:

    print("OS error: {0}".format(err))

except ValueError:

    print("Could not convert data to an integer.")

except:

    print("Unexpected error:", sys.exc_info()[0])

    raise

else语句,如果没有异常则执行此语句。

for arg in sys.argv[1:]:

    try:

        f = open(arg, 'r')

    except OSError:

        print('cannot open', arg)

    else:

        print(arg, 'has', len(f.readlines()), 'lines')

        f.close()

try-finally语句,无论是否有异常,都将执行该语句。

try:

<语句>

finally:

<语句>    #退出try时总会执行

raise

except语句可以在异常名后指定一个变量,这个变量与一个异常实例绑定,参数存于instance.args

>>> try:

...     raise Exception('spam', 'eggs')

... except Exception as inst:

...     print(type(inst))    # the exception instance

...     print(inst.args)     # arguments stored in .args

...     print(inst)          # __str__ allows args to be printed directly,

...                          # but may be overridden in exception subclasses

...     x, y = inst.args     # unpack args

...     print('x =', x)

...     print('y =', y)

...

<class 'Exception'>

('spam', 'eggs')

('spam', 'eggs')

x = spam

y = eggs

1.3.    raising exceptions

raise语句可以触发一个异常。

raise [Exception [, args [, traceback]]]

>>> raise NameError('HiThere')

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

NameError: HiThere

1.4.    自定义异常

通过创建新的异常类,用户可以定义自己的异常类。一般情况下从Exception类直接或间接派生类。

异常类和其它类在本质上没什么不同,但一般只用异常类提供异常信息。

1.5.    异常清理

try…finally语句可以实现异常清理功能。

>>> def divide(x, y):

...     try:

...         result = x / y

...     except ZeroDivisionError:

...         print("division by zero!")

...     else:

...         print("result is", result)

...     finally:

...         print("executing finally clause")

...

>>> divide(2, 1)

result is 2.0

executing finally clause

>>> divide(2, 0)

division by zero!

executing finally clause

>>> divide("2", "1")

executing finally clause

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "<stdin>", line 3, in divide

TypeError: unsupported operand type(s) for /: 'str' and 'str'

1.6.    预定义清理操作

部分对象定义了标准清理操作,当该对象不在使用时执行,不论对该对象的操作成功与否。

典型的是文件打开和关闭,在这种情况下通常使用with语句。

with open("myfile.txt") as f:

    for line in f:

        print(line, end="")

猜你喜欢

转载自www.cnblogs.com/wodeboke-y/p/9717970.html
今日推荐