跟着我们一起学 Python 30天课程-第14天-错误处理Error Handling

作者 : IT 大叔 本文共5751个字,预计阅读时间需要15分钟 发布时间: 2020-08-21

没有程序是完美的。除非这是一个精心编写的hello world程序,否则😃

今天,我探讨了有关处理Python错误的所有方法。我将尝试用简单明了的词来解释。处理错误可能是编程中最重要的概念。

所有应用程序都容易出现错误(即错误或异常)。错误不是邪恶的。当程序由于某种原因无法运行或执行时,大多数时间的错误都会传达有用的消息。可能是偶然的绑定错误,可能是应用程序在尝试访问Internet时处于脱机状态。可能在计算时出现错误,或者程序内存不足。编写程序时,可能会发生很多可能的错误。当检测到错误时,程序将终止。这可能是我们想要的,也可能不是。更好,更务实的方法不是期望代码没有错误运行,而是处理错误并相应地采取一些措施。

在Python中,错误可大致分为两类-语法错误和异常。

当我们编写一些Python解释器无法验证为正确的Python代码的Python代码时,就会发生语法错误。

print('A grave mistake) # Missing end quote. Will result in a syntax error
def hello # Missing :, will result in syntax error
    print('hello')

每当我们遇到语法错误时,Python解释器都会通过提供详细信息来说明引起错误的行,从而将其更正,从而做好工作。

有趣的部分是关于除语法错误以外可能发生的另一种错误。

我们的程序经常连接到外部世界,以接收某些值并根据这些值执行计算。这些值总是有可能不正确。在这种情况下,将发生错误。因此,需要对其进行处理。

age = input('Enter your age')
if age > 18:
  print('You are an adult')
else:
  print('You are a minor')

运行此简单代码将导致异常。

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    if age > 18:
TypeError: '>' not supported between instances of 'str' and 'int'

Type_Exception是一个例外,因为age的值是一个字符串。因此,为防止这种情况,年龄需要进行类型转换或转换为整数。

age = int(input('Enter your age'))
if age > 18:
  print('You are an adult')
else:
  print('You are a minor')

现在,如果用户提供的是字符串值而不是数字,则将出现另一个异常。

Enter your age asdf
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    age = int(input('Enter your age'))
ValueError: invalid literal for int() with base 10: 'asdf'

Try except block

为了防止此类错误,Python提供了一个try except块,将动作放置在该try块内,如果有异常,except则将执行该块。

作为比较,在JavaScript世界中,有一个try catch障碍。Python只是用一个不同的名字catch。功能完全相同。

try:
  age = int(input('Enter your age'))
  if age > 18:
    print('You are an adult')
  else:
    print('You are a minor')
except:
  print('Invalid value provided')

Else block

除了该try except块之外,Python还提供了一个else块,如果try except代码块中没有异常,则该块将被执行。它是该try except语句的扩展。

try:
  age = int(input('Enter your age'))
  if age > 18:
    print('You are an adult')
  else:
    print('You are a minor')
except:
  print('Invalid value provided')
else:
  print('Thank You!')

Finally block

通常,在编写程序时,无论是否存在异常,我们都希望执行操作。例如,可以将日志消息发送到服务器。Python提供了一个finally块作为该块的一部分,try except无论是否存在异常,该块都会被执行。

try:
  age = int(input('Enter your age'))
  if age > 18:
    print('You are an adult')
  else:
    print('You are a minor')
except:
  print('Invalid value provided')
finally:
  print('Sendiing dummy log to server') # always gets printed

内置异常 Built-in Exceptions

Python提供了许多内置的异常,它们基本上是BaseException类的实例。

Python内置异常

这些异常类可用于处理特定的异常,例如TypeErrorValueError,SystemError等。

from functools import reduce

def calc_average(number_list):
  '''
  accepts a list of numbers and returns average
  '''
  sum = reduce(lambda acc, curr: acc + curr, number_list)
  average = sum/len(number_list)
  return average

print(calc_average([1,2,3,4,5])) # 3.0

# Passing invalid arguments would result in errors
print(calc_average(['1','2','3','4','5'])) # TypeError
print(calc_average(None)) # TypeError
print(calc_average(3/0)) # ZeroDivisionError

为了使功能更具防御性,我们可以捕获(处理)那些特定的异常。

from functools import reduce

def calc_average(number_list):
  '''
  accepts a list of numbers and returns average
  '''
  try:
    sum = reduce(lambda acc, curr: acc + curr, number_list)
    average = sum/len(number_list)
    return average
  except TypeError:
    print('Only a list of numbers is valid')

print(calc_average('hello world')) # Only a list of numbers is valid

上面的代码处理无效的参数。但是,逻辑本身可能存在缺陷。也可以使用单独的except块进行处理

from functools import reduce

def calc_average(number_list):
  '''
  accepts a list of numbers and returns average
  '''
  try:
    sum = reduce(lambda acc, curr: acc + curr, number_list)
    average = sum/len(number_list)
    1.0/0 # Bug
    return average
  except TypeError:
    print('Only a list of numbers is valid')
  except ZeroDivisionError:
    print('cannot divide by zero')

print(calc_average([1,2,3,4,5])) # cannot divide by zero'

多个异常也可以在单个除外块中一起处理

from functools import reduce

def calc_average(number_list):
  '''
  accepts a list of numbers and returns average
  '''
  try:
    sum = reduce(lambda acc, curr: acc + curr, number_list)
    average = sum/len(number_list)
    return average
  except (TypeError, ZeroDivisionError): # handles both cases
    print('Only a list of numbers is valid')

print(calc_average(['asdfasdf'])) # Only a list of numbers is valid

上面编写的代码可以处理可能的异常,但它隐藏了由解释器提供的有用的堆栈跟踪错误,该错误准确地指出了负责代码的行。

实际错误消息和自定义错误消息可以组合在一起。

from functools import reduce

def calc_average(number_list):
  '''
  accepts a list of numbers and returns average
  '''
  try:
    sum = reduce(lambda acc, curr: acc + curr, number_list)
    average = sum/len(number_list)
    return average
  except TypeError as type_error:
    print(f'Only a list of numbers is valid {type_error}')
  except ZeroDivisionError as zero_div_error:
    print(f'cannot divide by zero {zero_div_error}')  

print(calc_average('hello world')) 
# Only a list of numbers is valid unsupported operand type(s) for /: 'str' and 'int'

这使错误消息更加有用。还可以使用raisePython中的关键字根据某些条件引发自定义错误

name = input('Enter your name')
if name.lower() == 'god':
  raise('Name cannot be GOD!')
else:
  print(name)

除非您是Savant,否则不可能记住所有Python内置的异常类!

python内置的异常文档可以用作处理所需异常的参考。

参考文献

  1. https://realpython.com/python-exceptions/
  2. https://www.programiz.com/python-programming/exception-handling
  3. https://docs.python.org/3/tutorial/errors.html

今天就这些!探索了一个重要的主题,它确实有助于编写更具弹性的Python代码。明天我将探讨另一个高级Python主题-生成器。

跟着我们一起学 Python 30天课程目录:

  1.  跟着我们一起学 Python 30天课程-第30天-免费Python资源 
  2.  跟着我们一起学 Python 30天课程-第29天-自动化测试 
  3.  跟着我们一起学 Python 30天课程-第28天-ML和数据科学II 
  4.  跟着我们一起学 Python 30天课程-第27天-ML和数据科学I 
  5.  跟着我们一起学 Python 30天课程-第26天-机器学习基础 
  6.  跟着我们一起学 Python 30天课程-第25天-Web 开发进阶
  7.  跟着我们一起学 Python 30天课程-第24天-Web开发基础 
  8.  跟着我们一起学 Python 30天课程-第23天-网页爬虫 
  9.  跟着我们一起学 Python 30天课程-第22天-脚本额外功能Scripting Extras 
  10.  跟着我们一起学 Python 30天课程-第21天-脚本编写基础 
  11.  跟着我们一起学 Python 30天课程-第20天-调试和测试 
  12.  跟着我们一起学 Python 30天课程-第19天-正则表达式 
  13.  跟着我们一起学 Python 30天课程-第18天-文件I / O 
  14.  跟着我们一起学 Python 30天课程-第17天-外部模块External Modules 
  15.  跟着我们一起学 Python 30天课程-第16天-模块基础Module Basics 
  16.  跟着我们一起学 Python 30天课程-第15天-生成器Generators 
  17.  跟着我们一起学 Python 30天课程-第14天-错误处理Error Handling 
  18.  跟着我们一起学 Python 30天课程-第13天-Decorators 
  19.  跟着我们一起学 Python 30天课程-第12天-Lambda Expressions & Comprehensions 
  20.  跟着我们一起学 Python 30天课程-第11天-函数编程Functional Programming基础 
  21.  跟着我们一起学 Python 30天课程-第10天-OOP Missing Pieces 
  22.  跟着我们一起学 Python 30天课程-第9天-OOP Pillars 
  23.  跟着我们一起学 Python 30天课程-第8天-OOP基础知识 
  24.  跟着我们一起学 Python 30天课程-第7天-开发环境搭建(Developer Environment) 
  25.  跟着我们一起学 Python 30天课程-第6天-循环II和函数(Loops II & Functions) 
  26.  跟着我们一起学 Python 30天课程-第5天-条件和循环I(Conditions & Loops I) 
  27.  跟着我们一起学 Python 30天课程-第4天-数据类型III(Data Types III) 
  28.  跟着我们一起学 Python 30天课程-第3天-数据类型II(Data Types II) 
  29.  跟着我们一起学 Python 30天课程-第2天-数据类型I(Data Types I) 
  30.  跟着我们一起学 Python 30天课程-第1天-简介 
免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » 跟着我们一起学 Python 30天课程-第14天-错误处理Error Handling

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论