pyqt5 捕获异常确保程序不退出_python基础 | 条件 循环 异常 断言

c272a7ac8e675c8cee0a6821c19e7b5f.png

ddd44f0e5dd16e254a93fd82af37a0ee.png

999fd86c55962789f493e2a6502735b9.png

图|一张顾巷

文|一张顾巷

条件判断

条件判断就是 根据一条或多条条件的执行结果(True/False) 来决定执行对应区域的代码。 //条件判断三巨头//

三巨头:if、else、elif

含义就是字面意思,不多加赘述了。示例如下:

# 单分支(只有一个if),如果代码块只有一条语句,可以和if语句写到一行company = 'i-search'    print("所属公司为艺赛旗")    # 双分支(if-else)sex = "女"if sex == '男':    print("一枚男娃娃")else:    print("一枚女娃娃") # 多分支(if-elif-else)age= 26if 0 <= age< 18:    print("未成年!")elif 18 <= age    print("大好年华,造作呀!")elif 25 <= age< 60:    print("中年社畜!")else:    print("脱离苦海!")        # 运行结果如下:所属公司为艺赛一枚女娃娃中年社畜!

// 条件表达式 //

一个 简化版的 if-else ,常在赋值时使用。 以“将两个值中较大值赋值给一个变量”为例。示例如下:
a, b = 1, 2c = a if a > b else bprint('c = %d' % c)# 输出结果如下c = 2

循环

// for循环 // 当我们需要重复执行某行或某个代码块的时候可以使用循环。 举个栗子? : 若不使用循环结构计算1加到100,你可能会写出这样的代码:
sum = 1 + 2 + 3 + 4 +... + 100 
如果要你加到1000,或者10000呢?光枚举就可能写满一本书,繁琐且不实际。 如果有了循环,你只需下面这样一段代码:
sum = 0for i in range(1,101):    sum += iprint("输出1-100的求和结果:" % sum)# 运行结果如下:输出1-100的求和结果:5050

// while循环 //

另外一种循环结构while。

把上面for循环的示例改为while循环:

sum = 0index = 1while index <= 100:    sum += index    index += 1print("输出1-100的求和结果:" % sum)# 运行结果如下:输出1-100的求和结果:5050

如果while后的判断条件返回值为True,执行循环体中的代码,否则退出循环。可以搭配else一起使用,当循环执行完后执行某段代码,可选但非必须,for循环也可以用else。

// 循环控制姐妹花 //

python为我们提供了两个循环控制关键字  break 和 continue  。二者区别就是break会终止循环,continue不终止循环。 break 用于 终止整个循环 ,示例如下:
for i in range(7):    if i == 2:        break      print(i) # 运行结果如下:01 
continue跳过本次循环,执行下一次循环 ,示例如下:
for i in range(7):    if i == 2:        continue    print(i)    # 运行结果如下:013456    

// 循环嵌套 //

循环嵌套就是 循环里面有另一个循环。 举个最经典的例子,打印9*9乘法表,示例如下:
print("打印九九乘法表:")i = 1while i <= 9:    j = 1    while j <= i:        print('%d * %d = %d' % (i, j, i * j), end='\t')        j += 1    print()    i += 1# 运行结果如下:打印九九乘法表:1 * 1 = 1 2 * 1 = 2   2 * 2 = 4 3 * 1 = 3   3 * 2 = 6   3 * 3 = 9 4 * 1 = 4   4 * 2 = 8   4 * 3 = 12  4 * 4 = 16 5 * 1 = 5   5 * 2 = 10  5 * 3 = 15  5 * 4 = 20  5 * 5 = 25 6 * 1 = 6   6 * 2 = 12  6 * 3 = 18  6 * 4 = 24  6 * 5 = 30  6 * 6 = 36 7 * 1 = 7   7 * 2 = 14  7 * 3 = 21  7 * 4 = 28  7 * 5 = 35  7 * 6 = 42  7 * 7 = 49 8 * 1 = 8   8 * 2 = 16  8 * 3 = 24  8 * 4 = 32  8 * 5 = 40  8 * 6 = 48  8 * 7 = 56  8 * 8 = 64 9 * 1 = 9   9 * 2 = 18  9 * 3 = 27  9 * 4 = 36  9 * 5 = 45  9 * 6 = 54  9 * 7 = 63  9 * 8 = 72  9 * 9 = 81

// 死循环 //

死循环就是由于程序的逻辑问题,导致循环结构中的代码块一直执行, 循环的条件永远为True , 导致无法跳出循环,所以写代码的时候需要调试,确保程序的逻辑正确性。 当然,死循环也不是一无是处的, 在执行一些 轮询操作 时经常用到,等满足某个条件再break退出这个循环。

异常

了解异常前,先要区分下 语法错误运行时异常

语法错误:连编译器都过不了的错误,如if后漏掉冒号: 程序都跑不起来;

运行时错误:程序运行后,因为程序的业务逻辑问题引起的程序崩溃,比如除以0;

// 常见异常 // Exception类 是所有异常类的父类,又称万能异常,可以用于捕获任何异常!Python中的常见异常如下表所示:
异常描述信息
AssertionError断言语句失败
AttributeError尝试访问未知的对象属性
IndexError索引超出序列的范围
keyError字典中查找一个不存在的Key
NameError尝试访问一个不存在的变量
OSError操作系统产生的异常,比如FileNotFoundError
SyntaxErrorPython语法错误
TypeError不同类型间的无效操作
ZeroDivisionError除数为0
IOError输入输出错误
ValueError函数传参类型错误
// 异常捕获 // Python中为我们提供了两组语句用于异常捕获,try-expect-else 和 try-finally。 六种常见的使用: try捕获了异常,直接丢给except后的代码处理
try:    result = 1 / 0except:    print("捕获到异常了!")# 运行结果如下:捕获到异常了!
捕获特定类型
try:    result = 1 / 0except ZeroDivisionError:    print("捕获到除数为零的错误")# 运行结果如下:捕获到除数为零的错误
针对不同的异常设置多个except
try:    sum = 1 + '2'    result = 1 / 0except TypeError as reason:    print("类型出错:" + str(reason))except ZeroDivisionError as reason:    print("除数为0:" + str(reason))# 运行结果如下:类型出错:unsupported operand type(s) for +: 'int' and 'str'
对多个异常统一处理
try:    result = 1 / 0    sum = 1 + '2'except (TypeError, ZeroDivisionError) as reason:    print(str(reason))# 运行结果如下:division by zero
当没有检测到异常时才执行的代码块,可以用else
try:    result = 4 / 2except ZeroDivisionError as reason:    print(str(reason))else:    print("没有发生异常,输出结果:%d" % result)# 运行结果如下:没有发生异常,输出结果:2
无论是否发生异常都会执行的一段代码块
try:    result = 4 / 2except ZeroDivisionError as reason:    print(str(reason))else:    print("没有发生异常,输出结果:%d" % result)finally:    print("无论是否发生异常都会执行~")# 运行结果如下:没有发生异常,输出结果:2无论是否发生异常都会执行~

// 异常抛出 //

Python为我们提供的都是异常都是在特定条件下才会触发的。而在一些特定的场景,某些操作可能会引起我们的业务异常,

比如让用户输入一串手机号码,手机号码由一串0-9的数字构成,而如果用户输入了其他字符,显然是不合理的。

我们可以通过正则对输入的手机号码进行校验,如果是手机号码就打印出来,不是的话则利用Python提供的 raise关键字 显式抛出一个ValueError异常。示例如下:

import re# 注:这段正则你只需要知道是用来匹配电话号码的,正则详细讲解见上上期phone_compile =re.compile(r'(?)number = input("请输入一串手机号码:")if phone_compile.match(number) is not None:    print("您输入的手机号码是:%s" % number)else:    raise ValueError# 运行结果如下:请输入一串手机号码:123456787Traceback (most recent call last):  File "G:/okfuGit/demo.py", line 12, in     raise ValueErrorValueError

// 自定义异常 //

上面通过raise关键字显式的抛出了一个内置的ValueError异常。如果程序里除了这个号码验证还有邮箱验证,我们又抛出一个这样的异常的话,会不利于异常的定位,异常是哪个地方引起的?

对此,我们可以自定义异常,根据不同的错误抛出对应的异常。我们自定义一个非手机号码异常,代码示例如下:

# 自定义异常class PhoneNumberException(Exception):    def __init__(self, message):        Exception.__init__(self)        self.message = messageif __name__ == '__main__':    phone_compile = re.compile(r'(?)    number = input("请输入一串手机号码:")    if phone_compile.match(number) is not None:        print("您输入的手机号码是:%s" % number)    else:        raise PhoneNumberException("非法的手机号码!")# 运行结果如下:请输入一串手机号码:1234Traceback (most recent call last):  File "G:/okfuGit/demo.py", line 19, in     raise PhoneNumberException("非法的手机号码!")__main__.PhoneNumberException

// sys.exc_info()函数 //

除了前面介绍的获取异常信息的方式外,还可以通过sys模块里的exc_info()函数来获得,使用代码示例如下:
import systry:    result = 1 / 0except:    tuple_exception = sys.exc_info()# 输出结果依次是:异常类,类示例,跟踪记录对象for i in tuple_exception:    print(i)# 运行结果如下:'ZeroDivisionError'>division by zeroobject at 0x000001E079360288>

断言

assert关键字 后面的判断条件为假时,程序自动崩溃并抛出AssertionErro异常。一般测试程序时用到:需要 确保某个条件为真程序才能正常工作 的时候使用。需与异常进行区分:
  • 异常处理:用于对程序发生异常情况的处理,以增加程序健壮性和容错性。

  • 断言:用来检查非法情况,以帮助开发者快速定位问题位置。

Python中关于断言assert的常见用法有两种:

  • assert 判断条件:如果判断条件为false,就raise一个AssertionError。

  • assert 判断条件,异常描述:如果判断条件为false,就raise一个带描述信息的AssertionError。

阿巷推荐|点击阅读

c98446450f0f02c4bdc20087f3fb0d11.png

python基础 | 语法常识

e5baf81266a5b425321f1f35468bc74c.png

python基础 | 正则扫盲


版权声明:本文为weixin_39884373原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。