python程序异常与调试

python程序异常与调试

一、对于异常的理解

编写代码时,通常会遇到一些错误:编译错误,运行错误,这两种错误产生的原因有太多种,对程序的影响和查找错误的方法都有很大区别。

编译错误:编写的程序不符合程序的语法规定而导致的语法问题。

运行错误:能够顺利编写,但在运行程序时报错,产生的结果也正确的出入太大。例如:调用的参数的个数不对;缩进符错误等等。

二、识别常见的异常

2.1语法造成的异常

因为语法错误引出的异常一般是因为书写代码没有按照语法规定。

示例:

print 'hello world'

输出:

  File "C:\Users\86139\学习\main.py", line 421
    print 'hello world'
          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('hello world')?

解释:输出提示错误,还会告诉编写人员,错误的具体位置。”^“这个符号所指的地方就是提醒改错的地方。这里是缺少(),会提醒你。

2.2运行时造成的异常

运行时出错证明并不是语法错误,一般是代码可以运行的,但因为其他某种原因特殊情况而发生了报错。

拿之前的代码做示例:

class father:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname
  def printname(self):
    print(self.firstname, self.lastname)
class sun(father):
  def __init__(self, fname, lname):
    super().__init__( fname, lname)
    self.xinxi =22
  def san(self):
    print("姓名",self.firstname,"性别",self.lastname,"年龄", self.xinxi)
x = sun("小王", "憨憨","22")
x.san()

输出:

Traceback (most recent call last):
  File "C:\Users\86139\学习\main.py", line 389, in 
    x = sun("小王", "憨憨","22")
TypeError: __init__() takes 3 positional arguments but 4 were given

解释:在sun类中print(“姓名”,self.firstname,“性别”,self.lastname,“年龄”, self.xinxi)输出四个参数。

但是def init(self, fname, lname)只给了三个。参数数量对不上,语法上没有错误,但是运行的时候会报错。

2.3 分析异常报错时提示信息

异常提示为了表达重要性,都是用红色提醒标记,主要信息:

~发生异常程序的文件名和具体位置,如: File "C:\Users\86139\学习\main.py

~发生异常语句在程序中的行号,如:line 426

~发生异常语句,如:print “Hello”

~发生了哪一种异常,如:SyntaxError: Missing parentheses in call to ‘print’.

~提示解决方法,如: Did you mean print(“Hello”)?

三、处理异常的方法

3.1 try和except

try代码块内监视可能出现的异常的程序语块,expect代码块是用户对异常语句处理。

try:
  print(i)
except:
  print("乌市")

输出:

乌市

理解:可以类比去记,这运行和if结构很像当try出现错误就运行expect代码块。

当有多个except语句是,执行的规则:

~如果异常的类型和except之后的名称相符,对应的except语句就i被执行。

~如果一个异常没有与任何的except相符,那么这个异常将会传递上层的try中。

~多个except语句时,只可能有一个分支会被执行。

~except (exp1 , exp2,…)表示可以同时处理多个异常。

3.2 else语句

else代码块放置的是当try中没有发生异常时要执行的代码。

try:
  print("Hello")
except:
  print("小王")
else:
  print("最帅")

输出:

Hello
最帅

当try代码块报错:

try:
  print "Hello"
except:
  print("小王")
else:
  print("最帅")

输出:

  File "C:\Users\86139\学习\main.py", line 426
    print "Hello"
          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello")?

3.3 finally语句

finally指定的代码块,不论try块的对错都输出finally。

try:
  print(x)
except:
  print("Something went wrong")
finally:
  print("The 'try except' is finished")

输出:

葡萄
哈密瓜

3.4抛出异常(引发异常)raise

主动抛出一个异常,这需要关键字raise。

示例:

a = 10
b = 0
if(b==0):
  raise ZeroDivisionError
print("good")

输出:

Traceback (most recent call last):
  File "C:\Users\86139\学习\main.py", line 440, in 
    raise ZeroDivisionError
ZeroDivisionError

程序就不会执行最后一条print语句,而是在抛出异常时就推出了。

在抛出异常也可以给出提示。

示例:

a = 10
b = 0
if(b==0):
  raise ZeroDivisionError('小王')
print("good")

输出:

Traceback (most recent call last):
  File "C:\Users\86139\学习\main.py", line 440, in 
    raise ZeroDivisionError('小王')
ZeroDivisionError: 小王

你可能感兴趣的:(python,开发语言)