Python的异常处理

Python的异常处理try的基本用法。

方法一 :try..except

把通常的语句放在 try 代码块中,将错误处理器代码放置在 except 代码块中。

try:        # 尝试运行以下代码
    result = 4 / 0
    print(result)
except:        # 捕获到异常执行以下代码
    print('程序异常')

运行结果:程序异常

通过上面可以看到,如果没有出现异常,它只运行try下的代码;出现异常,它就运行了except的代码。

如果明确知道报的的是ZeroDivisionError异常的话,那可以这样写:

try:
    x = 4 / 0
    print(x)
except ZeroDivisionError:        # 捕获到ZeroDivisionError,执行代码
    print('不能除零')
except:                            # 如果出现其它错误,执行代码
    print('其它错误')

运行结果:不能除零

如果想看捕获的异常详细信息,可以:

try:
    x = 4 / 0
    print(x)
except ZeroDivisionError as ze:        # 捕获到ZeroDivisionError,执行代码
    print('出现异常',ze)
运行结果:出现异常 division by zero

方法二:try...else语句

else语句:在try语句中的代码没有任何异常的情况下,再执行else语句下的代码。

 

try:
    x = 4 / 0
    print(x)
except ZeroDivisionError:        # 捕获到ZeroDivisionError,执行代码
    print('不能除零')
except:                            # 出现其它错误,执行代码
    print('其它错误')
else:                            # 如果try执行没有出现异常,再执行else中的代码
    print('没有异常')

 

运行结果:不能除零

 

方法五:try...finally语句

finally语句:不管上面有没有异常,都要执行finally语句的代码,通常是做一些必须要释放的资源的代码,最典型的就是文件操作和数据库操作。

 

f = open('data.txt')
try:
    print(f.read())
except:
    print('文件操作错误')    # 文件始终是打开的,可能后面再读取的时候就会遇到错误,这种情况下适合用finally
finally:                        # 不管上面有没有出现异常,都要执行finally下的代码
    f.close()

 

运行结果:文件操作错误

 

方法六:抛出异常

def method():
    raise NotImplementedError('该方法代码还未实现')
    # 设设定默认的报错
method()

运行结果:

Traceback (most recent call last):
  File "D:/python/lianxi/add.py", line 17, in <module>
    method()
  File "D:/python/lianxi/add.py", line 15, in method
    raise NotImplementedError('该方法代码还未实现')
NotImplementedError: 该方法代码还未实现

raise语句是抛出一个指定的异常。

 

Python调试常见报错及解决

问题一:TabError: inconsistent use of tabs and spaces in indentation

C:\Users\tl>python C:\Users\tl\Desktop\test.py
  File "C:\Users\tl\Desktop\test.py", line 7
    num1 = 4
           ^
TabError: inconsistent use of tabs and spaces in indentation

直接定义值的方式不正确

 

问题二:IndentationError: unexpected indent

C:\Users\tl>python C:\Users\tl\Desktop\test.py
  File "C:\Users\tl\Desktop\test.py", line 11
    print compareNum
                   ^
IndentationError: unexpected indent

该行缩进不正确

 

问题三:SyntaxError: Missing parentheses in call to 'print'. Did you mean print(compareNum)?

C:\Users\tl>python C:\Users\tl\Desktop\test.py
  File "C:\Users\tl\Desktop\test.py", line 11
    print compareNum
                   ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(compareNum)?

Print后面没有加括号

 

问题四:SyntaxError: Non-ASCII character '\xe4' in file 

/Users/alice/venv/bin/python /Users/alice/PycharmProjects/first/venv/tensorflow1.py
  File "/Users/alice/PycharmProjects/first/venv/tensorflow1.py", line 5
SyntaxError: Non-ASCII character '\xe4' in file /Users/alice/PycharmProjects/first/venv/tensorflow1.py on line 5, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

Process finished with exit code 1

使用了中文编码或者字符,解决方法:在Python源文件的最开始一行,加入一句:# coding=UTF-8(等号换为”:“也可以)

 

问题五:SyntaxError: EOL while scanning string literal

File "/Users/alice/PycharmProjects/untitled/createdataconnectsql.py", line 17
    sql = "SELECT * FROM idCard
                              ^
SyntaxError: EOL while scanning string literal

idCard后面少了引号

 

问题六:SyntaxError: unexpected EOF while parsing

File "/Users/alice/PycharmProjects/untitled/createdataconnectsql.py", line 35
    
               ^
SyntaxError: unexpected EOF while parsing

少了部分函数,检查代码发现原try函数后面少了except,加上后即可

try:
   # 执行SQL语句
   cursor.execute(sql)
   # 获取所有记录列表
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # 打印结果
      print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s")
except:
   print ("Error: unable to fecth data")

问题七:TypeError: bad operand type for unary +: 'str'

检查代码发现是因为/的位置不对,放在了'的外面

image.save('/Users/alice/Documents/CreatFontDemo/photo'+row[0]+/'等比例缩小.JPG', 'jpeg')

修改为'里面就不报错了

image.save('/Users/alice/Documents/CreatFontDemo/photo'+row[0]+'/等比例缩小.JPG', 'jpeg')

 

问题八:TypeError: %c requires int or char
TypeError: %d format: a number is required, not str

Traceback (most recent call last):
  File "/Users/litan/PycharmProjects/untitled2/test.py", line 3, in <module>
    print ('%s and %c are fruit! '%(a,b) )
TypeError: %c requires int or char

或者:

Traceback (most recent call last):
  File "/Users/litan/PycharmProjects/untitled2/test.py", line 3, in <module>
    print ('%s and %d are fruit! '%(a,b) )
TypeError: %d format: a number is required, not str

检查代码发现是因为变量引用的方式不对,%c 改成 %s就可以了

a="apple"
b="banana"
print ('%s and %s are fruit! '%(a,b) )

 

问题九:TypeError: 'int' object is not subscriptable

Traceback (most recent call last):
  File "/Users/alice/PycharmProjects/Mypython/renren.py", line 5, in <module>
    if m[0]==m[-1]:
TypeError: 'int' object is not subscriptable

分析原因是subscriptable表示可以有下标,当不可以有下标的对象比如int使用了下标,就会报错,那么需要将原本的int转化为支持的类型

for m in range(1,10):
    m="%d" % m
    # 或者m=str(m)均可
    if m[0]==m[-1]:
        print(m)

 

问题十:requests.exceptions.ConnectionError: HTTPConnectionPool(host='test.com', port=80)

这个可能是服务器或网络不通,可以尝试看浏览器里是否可访问