Bug:程序编写有问题造成的错误,称之为Bug.    debug:调试

注意:bug是程序本身有问题、有缺陷、系统漏洞

异常:完全无法在程序运行中预测的错误,例如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据时,网络突然断掉了

try ……except……finally……

将某些可能会出错的代码,放置在try中来运行这段代码,如果执行错误,则该错误之后、except语句之前,这两个点之间的代码不会继续执行,而是直接跳转到except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

(1)如果没有错误发生,则except语句块不会被执行,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句。

(2)finally语句块可有可无,但是如果有的话,则一定会被执行

(3)有多种不同类型的错误,应该有不同的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')

(4)Python所有的错误都是从BaseException类派生的。

Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except语句块时需要注意,它不但捕获该类型的错误,还把其子类也“一网打尽”。

UnicodeError是ValueError的子类

BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
| +-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning

(5)不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。

例如:foo(s)中的语句可能会出错,但是没有使用try语句块,这是因为在main函数中使用了try语句块,也能捕获该错误。

def foo(s):
return 10 / int(s) def bar(s):
return foo(s) * 2 def main():
try:
bar('')
except Exception as e:
print('Error:', e)
finally:
print('finally...')

调用栈

出错的时候,一定要分析错误的调用栈信息,才能定位错误的位置

Traceback (most recent call last): 这是错误的跟踪信息

记录错误

既然能通过try语句块来捕获错误,可以把错误原因打印出来,同时,让程序继续执行下去。

如何打印错误原因? 答:Python内置的logging模块可以非常容易地记录错误信息

通过配置,logging还可以把错误记录到日志文件里,方便事后排查

 #记录错误logging
#err_logging.py
import logging
def foo(s):
return 10/int(s) def bar(s):
return foo(s)*2 def main():
try:
bar('')
except Exception as e:
logging.exception(e) main()
print('END')

结论:可以看到,同样是出错,但程序打印完错误信息后会继续执行,并正常退出。

抛出错误,raise语句

格式:raise  错误类型() ,错误类型,即是参数

因为错误是class,捕获一个错误就是捕获到该class的一个实例。Python的内置函数会抛出很多类型的错误

只有在必要的时候才定义我们自己的错误类型。尽量使用Python内置的错误类型(如ValueError,TypeError)

 #抛出错误的另一种处理方式

 def foo(s):
n=int(s)
if n==0:
raise ValueError("invalid value:%s" % s)
return 10/n def bar():
try:
print('i am a good boy') #这句执行了
foo('s')
#执行这句时报错了,跳到except语句块,所以后面的语句就没有执行了
print('i am a good girl') #这句没有执行
except ValueError as e:
print('ValueError')
raise bar()

运行结果:

结论:1、可以看到程序执行到哪一句停止往下执行了

2、except语句块中raise后面没有任何参数,这种情况下,就会把当前错误原样抛出

Python错误 -- try/except/finally 、调用栈、记录错误、抛出错误的更多相关文章

  1. 错误try……except……else……finally 记录错误logging 抛出错误raise

    1.错误处理机制 try--except--finally 格式: try: 可能出错的代码 except xxx1Error as e: 处理1 except xxx2Error as e: 处理2 ...

  2. 《从零开始学Swift》学习笔记(Day54)——抛出错误

    原创文章,欢迎转载.转载请注明:关东升的博客 能放到try后面调用函数或方法都是有要求的,他们是有可能抛出错误,在这些函数或方法声明的参数后面要加上throws关键字,表示这个函数或方法可以抛出错误. ...

  3. PostgreSQL 抛出错误信息(错误行号)

    抛出错误行号是我们在写SQL中常用到的,在SQL Server和Oracle中都很简单,但是在PostgreSQL怎么实现呢?在网上查了下资料只有pg_exception_context包含错误行,我 ...

  4. ArrayList调用remove(int index)抛出UnsupportedOperationException问题分析以及解决记录

    使用Arrays转数组成为List后,不能调用add(...)和remove(...)方法,此时如果调用就会抛出UnsupportedOperationException异常 原因 其实Arrays. ...

  5. [Go] 如何正确地 抛出 错误 和 异常(error/panic/recover)?

    序言 错误 和 异常 是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从表面上看,一切皆错误的思路 ...

  6. python异常(概念、捕获、传递、抛出)

    异常 目标 异常的概念 捕获异常 异常的传递 抛出异常 01. 异常的概念 程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常 程序停止执 ...

  7. Lua 自己实现排序sort比较方法,抛出错误invalid order function for sorting

    明天新功能就要上了,结果刚刚突然QA说项目抛出了错误.握草,吓得立马出了一身汗. 查了一下错误,发现可能是自己写的不稳定排序造成的.自己感觉应该就是.把排序方法写成稳定的之后,代码分离编译进手机,跑了 ...

  8. .NET WebAPI 正确抛出错误详细信息

    try { ... } catch (Exception e) { //在webapi中要想抛出异常必须这样抛出,否则之抛出一个默认500的异常 var resp = new HttpResponse ...

  9. List 调用 remove 方法时抛出 java.lang.UnsupportedOperationException 异常原因

    原因 使用 Arrays.asList(arr) 转换的 List 并不能进行 add 和 remove 操作.       Arrays.asList(arr) 返回的类型是 Aarrays$Arr ...

随机推荐

  1. ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

    软件的定时中断很难控制精准触发沿的位置,可以通过 PL-PS 的中断完成精准的定时中断.PL 的中断通过 Verilog 代码产生,这样紧密结合 PS-PL 的处理,发挥各自的优势. 一.PL 侧定时 ...

  2. Net操作RabbitMQ

    原文:Net操作RabbitMQ 文章目录 1 安装 2 管理界面 3 RabbitMQ的基本概念 4 RabbitMQ的六种工作模式 4.1 简单模式 4.2 工作模式 4.3 发布/订阅模式 4. ...

  3. 使用HttpWebRequest和HttpWebResponse时接收数据中文乱码的情况

    今天在调试一个get请求的接口的时候发现HttpWebResponse方法接收数据的时候,中文出现乱码的情况. 原因是格式编码转码的问题. 原来自从Windows 2000之后的操作系统在文件处理时默 ...

  4. 上传文件大小与时间 Web.Config文件 httpRuntime 限制

    httpRuntime  <httpRuntime executionTimeout="90" maxRequestLength="40960" useF ...

  5. Smobiler客户端会话

    //客户端会话存值 Client.Session["userid"] = Class1.userid; //客户端会话取值 userid = Client.Session[&quo ...

  6. ssh tunneling应用案例-AWS EC2 vnc图形化桌面的支持

    一般地,无论是AWS EC2还是阿里云的云主机,linux系统默认都只提供ssh登录方式.如果你是一个技术控,非常希望把图形化界面给折腾出来,这其中就不需有vnc server的支持,除此之外,还涉及 ...

  7. Prime Path POJ-3126

    The ministers of the cabinet were quite upset by the message from the Chief of Security stating that ...

  8. Win10系统配置Java环境变量

    Win10系统配置Java环境变量 电脑重新装了个系统,又要重新配置JDK环境变量,这里做个记录. 安装JDK后在cmd里运行java会显示找不到指令,这种就是需要添加java的环境变量. 这里我记录 ...

  9. idea/借阅系统的APP开发

    (一) 今天去还书时,偶尔想到的idea. 看着在自主借还书机器面前的长龙,我突然想到为什么不将这部机器的功能弄成APP? 通过用手机扫条形码借书不是很方便吗? 哦,不行.借书可以,怎么确保用户将书还 ...

  10. HttpUtils请求工具类

    package com.cmcc.hybj.payment.framework.https; import java.io.UnsupportedEncodingException;import ja ...