㈠ python运行错误怎么办
一、python的错误处理:
在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错以及出错的原因。
在操作系统提供的调用中,返回错误码非常常见。比如打开文件的函数open(),成功时返回文件的描述符(就是一个整数),出错时返回-1用错误码来表示是否出错十分不便,因为函数本身应该返回的正常结果和错误码混在一起,造成调用者必须大量的代码来判断是否出错:def foo():
r = somefunction() if r == (-1): return (-1) return rdef bar():
r = foo() if r == (-1): print("Error") else: pass一旦出错,还要一级一级上报,直到某个函数可以处理该错误(比如,给用户输出一个错误信息)
所以,高级语言通常都内置了一套try...except...finally...的错误处理机制,python也不例外。try
让我们用一个例子来看看try的机制try: print("try....")
r = 10 / 0 print("result", r)except ZeroDivisionError as e: print("except:", e)finally: print("finally...")print("END....")
当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行
而是直接跳转至错误处理代码,即except语句块
执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。
上面的代码在计算10 / 0时 会产生一个除法运算错误:try....except: division by zerofinally...
END....>>>从输出可以看到,当错误发生时,后续语句print("result:", r)不会被执行,except由于捕获到ZeroDivisionError因此被执行。
最后,finally语句被执行。然后,程序继续按照流程往下走。
如果把除数0 变成2,则执行结果如下try....
result 5.0finally...
END....>>>由于没有错误发生,所以except语句块不会被执行,但是finally如果有则一定会被执行,当然finally也可以没有
你还可以猜测,错误应该有很多种类,日过发生了不同类型的错误,应该由不同的except语句块处理。
没错,可以有多个except来捕获不同类型的错误:try: print("try.....")
r = 10 / int("a") print("result:", r)except ValueError as e: print("ValueError:", e)except ZeroDivisionError as e: print("ZeroDivisionError:", e)finally: print("finally...")print("END...")
int()函数可能会抛出ValueError,所以我们用一个except捕获ValueError,用另一个except捕获ZeroDivisionError
此外,如果没有错误发生,可以再except语句块后面加一个else,当没有错误发生时,会自动执行else语句。try: print("try...")
r = 10 / int("2") print("result:", r)except ValueError as e: print("ValueError:", e)except ZeroDivisionError as e: print("ZeroDivisionError:", e)else: print("No error!")finally: print("finally...")print("END")
python的错误其实也是class,所有的错误类型都继承自BaseException,
所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”。
比如:try:
foo()except ValueError as e: print("ValueError")except UnicodeError as e: print("UnicodeError")
第二个except永远也捕获不到UnicodeError, 因为UnicodeError是ValueError的子类
如果有,也是被第一个except给捕获了。
python所有的错误都是BaseException类派生的。
所有常见的错误类型和继承关系看这里:
https://docs.python.org/3/library/exceptions.html#exception-hierarchy使用try...exccept捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()调用foo()
foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理:def foo(s): return 10 / int(s)def bar(s): return foo(s) * 2def main(): try:
bar("0") except Exception as e: print("Error:", e) finally: print("finally...")
也就是说,不需要在每个可能出错的地方去捕获异常,只要在合适的层次去捕获就可以了。
这样一来,就大大减少了写 try...except...finally的麻烦。
二、调用堆栈
如果错误没有被捕获,他就会一直往上抛,最后被python解释器捕获,打印一个错误信息,然后程序退出。def foo(s): return 10 / int(s)def bar(s): return foo(s) * 2def main():
bar("0")
main()
执行结果为:
Traceback (most recent call last):
File "C:/Python36/test.py", line 10, in <mole>
main()
File "C:/Python36/test.py", line 8, in main
bar("0")
File "C:/Python36/test.py", line 5, in bar return foo(s) * 2
File "C:/Python36/test.py", line 2, in foo return 10 / int(s)
ZeroDivisionError: division by zero
出错并不可怕,可怕的时不知道哪里出错了。解读错误信息时定位错误的关键。
我们从上往下可以看到整个错误的调用函数链。
错误第一行:
Traceback (most recent call last):
这告诉我们的是错误的跟踪信息。
File "C:/Python36/test.py", line 10, in < mole >main()
说明调用main()出错了,在代码文件test.py中第10行,但是原因是第8行:
File"C:/Python36/test.py", line8, in main
bar("0")
调用bar("0")出错了,在代码文件test.py中第8行,但原因是第5行:
File"C:/Python36/test.py", line5, in barreturn foo(s) * 2调用return foo(s) * 2时出错了,在test.py中第5行,但原因是第2行
File "C:/Python36/test.py", line 2, in foo return 10 / int(s)
ZeroDivisionError: division by zero
这时我们找到了源头,原来在第2行调用return 10 / int(s)出错了,错误为ZeroDivisionError
三、记录错误
如果不捕获错误,自然可以让python解释器来打印出错误堆栈,但是程序也被结束了。
既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。
python内置的logging模块可以非常容易地记录错误信息:import loggingdef foo(s): return 10 / int(s)def bar(s): return foo(s) * 2def main(): try:
bar("0") except Exception as e:
logging.exception(e)
main()print("END")
输出结果为:
ERROR:root:division by zero
Traceback (most recent call last):
File "C:/Python36/test.py", line 12, in main
bar("0")
File "C:/Python36/test.py", line 8, in bar return foo(s) * 2
File "C:/Python36/test.py", line 5, in foo return 10 / int(s)
ZeroDivisionError: division by zero
END
同样是出错,但程序打印完错误信息后会继续执行,并正常退出。
通过配置,logging还可以把错误记录到日志文件里,方便事后排查。
四、抛出错误
因为错误是class,捕获一个错误就是捕获到该class的一个实例。
因此,错误并不是凭空产生的,而是有意创建并抛出的。
python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以抛出错误。
如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后用raise语句抛出一个错误的实例:class FooError(ValueError): passdef foo(s):
n = int(s) if n == 0: raise FooError("invalid value: %s" % s) return 10 / n
foo("0")
输出结果:
Traceback (most recent call last):
File "C:/Python36/test.py", line 10, in <mole>
foo("0")
File "C:/Python36/test.py", line 7, in foo raise FooError("invalid value: %s" % s)
FooError: invalid value: 0
只有在必要的时候才定义我们自己的错误类型。
如果可以选择python已有的内置错误类型(比如ValueError, TypeError),尽量使用python内置的错误类型。
最后,我们来看另一种错误处理方式:def foo(s):
n = int(s) if n == 0: raise ValueError("invalid value: %s" % s) return 10 / ndef bar(): try:
foo("0") except ValueError as e: print("ValieError") raisebar()
在bar()函数中,我们明明已经捕获了错误,但是,打印一个ValueError之后
又通过raise语句抛出去了。这不是有病吗
其实,这种错误处理方式不但没病,而且相当常见。
捕获错误目的只是记录一下,便于或许追踪。
但是,由于当前函数不知道应该怎么处理该错误,所以,最恰当的方式是继续往上抛,让顶层调用者去处理。
好比一个员工处理不了一个问题时,就把问题一直往上抛,最终会抛给CEO去解决。
注意:raise语句如果不带参数,就会把当前错误原样抛出。
此外,在except中raise一个Error,还可以改写错误类型try: 10 / 0except ZeroDivisionError: raise ValueError("do not input zero!")
输出结果:
Traceback (most recent call last):
File "C:/Python36/test.py", line 4, in <mole> raise ValueError("do not input zero!")
ValueError: do not input zero!>>>只要是合理的转换逻辑就可以,但是,绝不应该把一个IOError转成毫不相干的valueError.
总结:
python内置的 try...except...finally 用来处理错误十分方便。
出错时,会分析错误信息并定位错误发生的代码位置才是关键的。
程序也可以主动抛出错误,让调用者来处理相应的错误。
但是应该在文档中写清楚可能会抛出哪些错误,以及错误产生的原因。
㈡ python出现这个错误是什么原因
搜集了一些python最重要的内建异常类名,并做了简单的介绍:
AttributeError:属性错误,特性引用和赋值失败时会引发属性错误
NameError:试图访问的变量名不存在
SyntaxError:语法错误,代码形式错误
Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions模块中定义。
IOError:一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误
KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误
IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引
TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误
ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误
ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数
㈢ 如何解决python -v 报错问题
解决python -v报错问题的方法:
在cmd命令行中输入“python -v”报错是因为没有将python的安装路径添加到系统环境变量path中,将python的安装路径添加进去就可以了
示例如下:
输入python -v结果:
更多Python知识,请关注:Python自学网!!
㈣ Python 运行报错NameError出现原因,怎么解决
python程序,报错NameError: name XX is not defined 是没有声明造成的,需要在文件的前两行进行声明编码,声明方法为:
1、写一个python文件,文件中有中文字符,且未声明编码。
㈤ Python使用pip出现致命错误
去python路径下搜索一下pip,有可能有pip3之类的可以用
㈥ python错误
异常名称 异常说明
AssertionError 断言语句(assert)失败
AttributeError 尝试访问未知的对象属性
EOFError 用户输入文件末尾标志EOF(Ctrl+d)
FloatingPointError 浮点计算错误
GeneratorExit generator.close()方法被调用的时候
ImportError 导入模块失败的时候
IndexError 索引超出序列的范围
KeyError 字典中查找一个不存在的关键字
KeyboardInterrupt 用户输入中断键(Ctrl+c)
MemoryError 内存溢出(可通过删除对象释放内存)
NameError 尝试访问一个不存在的变量
NotImplementedError 尚未实现的方法
OSError 操作系统产生的异常(例如打开一个不存在的文件)
OverflowError 数值运算超出最大限制
ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
RuntimeError 一般的运行时错误
StopIteration 迭代器没有更多的值
SyntaxError Python的语法错误
IndentationError 缩进错误
TabError Tab和空格混合使用
SystemError Python编译器系统错误
SystemExit Python编译器进程被关闭
TypeError 不同类型间的无效操作
UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
UnicodeError Unicode相关的错误(ValueError的子类)
UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
UnicodeTranslateError Unicode转换时的错误(UnicodeError的子类)
ValueError 传入无效的参数
ZeroDivisionError 除数为零
㈦ python报错no mole named是什么
原因及解决方法如下:
(1)如果'×××'是一些python包,比如说numpy、pandas等,这时候在终端输入pip install ×××命令安装相应的包即可。
(2)如果'×××'是非python的包, 比如说自己写了个alice.py文件,然后在bob.py的文件里要调用a,即import alice或者from alice import,这时候如果报错No mole named '×××'的话,是因为系统找不到alice.py这个文件。
解决方法:为python解释器指定搜索路径,即把alice的路径添加到环境变量里。可以在bob.py文件的开始加入以下代码,并使得alice.py在root_path路径下。
Python由荷兰数学和计算机科学研究学会的Guido van Rossum于1990 年代初设计,作为一门叫做ABC语言的替代品。
Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python解释器易于扩展,可以使用C或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python 也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
㈧ 运行python时代码一直报错怎么办
看上去是服务器本身出现了错误,返回500错误码,先用浏览器进行访问测试,如果没有错误可以试试使用代码模拟浏览器,加上header。
㈨ python运行报错
错误的原因是user这个变量从未被定义过,所以执行失败了。从你的代码中看,只需要将“user.”删除掉就能运行了。
㈩ python下载 pygame时显示启动程序中的致命错误
请问你可以截个图吗?
ps:是这样的:
C:Program FilesPython36Scriptspip install (此处填pygame文件的路径和全名!)
e.g:win64-installer-pygame.whl