可以使用try语句检测异常

try-except语句

try:

检测范围

except Exception[as reason]:

出现异常(Exception)后的处理代码


try-finally语句

try:

检测范围

except Exception[as reason]:

出现异常(Exception)后的处理代码

finally:

无论如何都会被执行的代码


raise语句


try:

f = open('我为什么是一个文件.txt','w')

print(f.write('我存在了'))

sum = 1 + '1'

except (OSError,TypeError):

print('出错啦')

finally:

f.close()

raise ZeroDivisionError('除数为零的异常')


----------------------分割线,哈哈哈------------------------


课后作业:


0.结合你自身的编程经验,总结下异常处理机制的重要性?

由于环境的不确定性和用户操作的不可以预知性都可能导致程序出现各种问题,因此异常机制最重要的无非就是:增强程序的健壮性和用户体验,尽可能的捕获所有预知的异常并写好处理的代码,当异常出现的时候,程序自动消化并恢复正常(不至于崩溃)。


1.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:

>>> my_list = [1, 2, 3, 4,,]

SyntaxError,语法错误


2.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:

>>> my_list = [1, 2, 3, 4, 5]

>>> print(my_list[len(my_list)])

IndexError,索引错误,超出序列的范围


3.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:

>>> my_list = [3, 5, 1, 4, 2]

>>> my_list.sorted()

尝试访问未知的对象属性,AttributeError: 'list' object has no attribute 'sorted'

正确的是sort()


4. 请问以下代码是否会产生异常,如果会的话,请写出异常的名称:

>>> my_dict = {'host': 'http://bbs.fishc.com', 'port': '80'}

>>> print(my_dict['server'])

KeyError,server键不存在


5. 请问以下代码是否会产生异常,如果会的话,请写出异常的名称:

def my_fun(x, y):

        print(x, y)

 

f(x=1, 2)

SyntaxError:positional argument follows keyword argument。关键字参数必须跟随在位置参数后面。


6.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:

f = open('C:\\test.txt', wb)

f.write('I love FishC.com!\n')

f.close()

NameError,open()第二个参数没有加''会被当做变量,而wb不存在


7.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:

def my_fun1():

        x = 5

        def my_fun2():

                x *= x

                return x

       return my_fun2()

 

my_fun1()

UnboundLocalError 函数fun2()中的x没有定义


--------------------分割线,哈哈哈------------------------

课后作业:

0.我们使用什么方法来处理程序中出现的异常?

使用try-except


1.一个try语句可以和多个except语句搭配吗?为什么

可以的,因为try语句块中可能出现多类异常,使用多个except语句可以分别捕获并处理各类异常


2.你知道如何统一处理多类异常吗?

except后使用()括起来多类异常


3.except后边如果不带任何异常类,Python会捕获所有(try语句块内)的异常并统一处理,但小甲鱼却并不建议这么做,你知道为什么吗?

因为会隐藏所有程序员未想到并且未做好准备处理的错误


4.如果异常发生在成功打开文件后,Python调到except语句执行后,并没有执行关闭的命令(用户写入文件的数据可能没有保存起来),因此我们需要确保无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做?

使用finally语句,finally语句块中的内容是确保无论如何都要被执行的

如果try语句块中没有错误,会跳过except语句指定finally语句

如果try语句块中有错误,会先执行except的语句块内容,然后接着执行finally语句块


5.请恢复以下马赛克挡住的内容,使得程序执行后可以按要求输出

if i == 2:

raise KeyboardInterrupt

-----------------分割线,哈哈哈------------------------

0.还记得我们第一个小游戏吗?只要用户输入非整型数据,程序立刻就会蹦出不和谐的异常信息后崩溃。请使用刚学的异常处理方法修改以下程序,提供用户体验。

import random


secret = random.randint(1,10)

print('--------------------我爱python-------------------')

temp = input('不妨猜下我心里想的哪个数字:')

try:

    guess = int(temp)

except ValueError:

    print('输入错误')

    guess = secret

while guess != secret:

temp = input('猜错了,请重新猜:')

guess = int(temp)

if guess == secret:

print('猜对了,你是我肚子里的蛔虫吗?')

print('猜对也没有奖励!')

else:

if guess > secret:

print('猜大了')

else:

print('猜小了')

print('游戏结束,不玩了!')


1.input()函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键Ctrl+d产生)和KeyboardInterrupt(取消输入,当用户按下组合件Ctrl+c产生),再次修改上面的代码,捕获处理input()的两类异常,提高用户体验。

import random


secret = random.randint(1,10)

print('--------------------我爱python-------------------')

temp = input('不妨猜下我心里想的哪个数字:')

try:

    guess = int(temp)

except (ValueError,EOFError,KeyboardInterrupt):

    print('输入错误')

    guess = secret

while guess != secret:

temp = input('猜错了,请重新猜:')

guess = int(temp)

if guess == secret:

print('猜对了,你是我肚子里的蛔虫吗?')

print('猜对也没有奖励!')

else:

if guess > secret:

print('猜大了')

else:

print('猜小了')

print('游戏结束,不玩了!')


2.尝试一个新的函数int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入

def int_input(intnum=''):

while True:

try:

int(input(intnum))

break

except ValueError:

print('错误,您输入的不是整数')


int_input('请输入一个整数:')


3.把文件关闭放在finally语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在‘My_File.txt’这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?

try:

f = open('My_File.txt') #当前文件夹中并不存在‘My_File.txt'这个文件

print(f.read())

except OSError as reason:

print('出错啦' + str(reason))

finally:

f.close()


执行后会提示NameError:name 'f' is not defined

改成

try:

f = open('My_File.txt') #当前文件夹中并不存在‘My_File.txt'这个文件

print(f.read())

except OSError as reason:

print('出错啦' + str(reason))

finally:

if 'f' in locals(): #如果文件对象变量存在当前局部变量符号表的话,说明打开成功

f.close()