Python基础必掌握的Traceback回溯机制 *** 作详解

Python基础必掌握的Traceback回溯机制 *** 作详解,第1张

学Python数据科学,玩游戏、学日语、搞编程一条龙。

整套学习自学教程中应用的数据都是《三國志》、《真·三國無雙》系列游戏中的内容。

当代码中引发异常时,Python 会打印回溯。Python 回溯具有丰富的信息,可以诊断和修复代码中引发异常的原因。

这个也就是经常说的报错错在哪里了。

文章目录
  • Python 回溯的概念
    • Python Traceback
  • Python中常见的回溯
    • AttributeError
    • ImportError
    • IndexError
    • KeyError
    • NameError
    • SyntaxError
    • TypeError
    • ValueError
  • 回溯的记录方法

Python 回溯的概念

回溯是一份文字报告,其中包含在代码中特定点进行的函数调用。Tracebacks 有很多名字,包括 stack trace、stack traceback、backtrace 等等。在 Python 中使用的术语是 traceback 。

变量未定义报错的例子。

# 代码程序
def example(data):
    print('the ' + data)
greet('data')

Traceback (most recent call last):
  File "example.py", line 4, in <module>
    greet('data')
  File "example.py", line 2, in greet
    print('the ' + data)
NameError: name 'data' is not defined
Python Traceback

  • 蓝色框: traceback 引发的异常名称。
  • 绿框: 异常名称后面是错误信息,引发异常的原因的信息。
  • 橘色框: 回溯的更进一步是从下到上移动的各种函数调用的文件。
  • 红色框: 这些调用的实际执行的代码。
Python中常见的回溯 AttributeError

当属性引用或分配失败时触发。

an_int = 1
an_int.attribute
Traceback (most recent call last):
  File "", line 1, in <module>
AttributeError: 'int' object has no attribute 'attribute'

a_list = (1, 2)
a_list.append(3)
Traceback (most recent call last):
  File "", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
ImportError

import 语句在尝试加载模块时遇到问题时触发。

import pandass
Traceback (most recent call last):
  File "", line 1, in <module>
ModuleNotFoundError: No module named 'pandass'

from collections import pandass
Traceback (most recent call last):
  File "", line 1, in <module>
ImportError: cannot import name 'pandass'
IndexError

序列下标索引超出范围时触发。

a_list = ['a', 'b']
a_list[3]
Traceback (most recent call last):
  File "", line 1, in <module>
IndexError: list index out of range
KeyError

当在现有k,v对中找不到映射dict键时触发。

a_dict['b']
Traceback (most recent call last):
  File "", line 1, in <module>
KeyError: 'b'
NameError

引用了未在代码中定义的变量、模块、类、函数或其他名称时触发。

def function(person):
    print(f'Hello, {persn}')
greet('World')
function(most recent call last):
  File "", line 1, in <module>
  File "", line 2, in greet
NameError: name 'persn' is not defined
SyntaxError

当解析器遇到语法错误时触发。

def function(person)
File "", line 1
    def function(person)
                       ^
SyntaxError: invalid syntax
TypeError

当 *** 作或函数应用于不适当类型的对象时触发。

1 + '1'
Traceback (most recent call last):
  File "", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

'1' + 1
Traceback (most recent call last):
  File "", line 1, in <module>
TypeError: must be str, not int

len(1)
Traceback (most recent call last):
  File "", line 1, in <module>
TypeError: object of type 'int' has no len()
ValueError

当 *** 作或函数接收到具有正确类型但值不适当的参数时触发。

a, b, c = [1, 2]
Traceback (most recent call last):
  File "", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)

a, b = [1, 2, 3]
Traceback (most recent call last):
  File "", line 1, in <module>
ValueError: too many values to unpack (expected 2)
回溯的记录方法

通过 logging 导入包、获取记录器调用 .exception() 该记录器来在脚本中记录回溯。

import logging
import sys
import requests

logger = logging.getLogger(__name__)

try:
    response = requests.get(sys.argv[1])
except requests.exceptions.ConnectionError as e:
    logger.exception()
    print(-1, 'Connection Error')
else:
    print(response.status_code, response.content)

终端执行

python .\test.py http://thisur.com 2> logs.log

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/799506.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存