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

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

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

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

这个也就是经常说的报错错在哪里了。
在这里插入图片描述

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 "<stdin>", 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 "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'

ImportError

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

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

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

IndexError

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

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

KeyError

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

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

NameError

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

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

SyntaxError

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

def function(person)
File "<stdin>", line 1
    def function(person)
                       ^
SyntaxError: invalid syntax

TypeError

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

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

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

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

ValueError

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

a, b, c = [1, 2]
Traceback (most recent call last):
  File "<stdin>", 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 "<stdin>", 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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/124556308