广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 异常处理
  • 450
分享到

Python 异常处理

异常Python 2023-01-31 01:01:04 450人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

写一个命令分发器初步要求 : 程序员可以方便地注册函数到某一个命令, 用户输入命令时, 路由到注册的函数, 如果此命令没有对应的函数, 执行默认函数分析 : 输入命令映射到一个函数, 并执行这个函数, 应该是cmd_tbl[cmd] = f

写一个命令分发器
初步要求 :

程序员可以方便地注册函数到某一个命令, 用户输入命令时, 路由到注册的函数, 如果此命令没有对应的函数, 执行默认函数
分析 :

输入命令映射到一个函数, 并执行这个函数, 应该是cmd_tbl[cmd] = fn 的形式, 使用字典比较合适
如果输入某一cmd 命令后, 没有找到函数就调用缺省的函数执行, 正好是字典的缺省参数, cmd 是字符串
基础框架 :

cmd_table = {}

def reg(cmd, fn):
cmd_table[cmd] = fn

def default_fun():
print('Unknow command')

def dispatcher():
while True:
cmd =input('>>')

    if cmd.strip() == '':   
        return 
    cmd_table.get(cmd, default_fun)()

def foo1():
print('text')
def foo2():
print('python')

reg('x', foo1)
reg('pyt', foo2)

dispatcher()
存在问题 :

函数注册太难看
函数和字典都在全局定义
如何在此基础上改进…

封装
将reg函数封装成装饰器, 并用它来注册函数

def reg(cmd):
def _reg(fn):
cmd_table[cmd] = fn
return fn
return _reg

@reg('x')
def foo1():
print('text') br/>@reg('pyt')
def foo2():
print('Python')
能否把字典, reg, dispatcher等也封装起来呢, 外面在使用的时候调度就可以了

def command_dispatcher():

cmd_table = {}

# 注册函数
def reg(cmd):
    def _reg(fn):
        cmd_table[cmd] = fn
        return fn
    return _reg

# 缺省函数
def default_func():
    print('Unknow command')

# 分发器, 调度
def dispatcher():
    while True:
        cmd = input('>>')
        # 退出条件
        if cmd.strip() == '':
            return 
        cmd_table.get(cmd, default_func)()
return reg, dispatcher
# 返回内层函数, 解构后外部调用

reg, dispatcher = command_dispatcher()

@reg('x')
def foo1():br/>print('text')
@reg('pyt')
def foo2():
print('python')

dispatcher()
输出结果 :

abcdef
Unknow command
x
text
pyt
python

符合设计预期 : 输入的cmd不存在的调用缺省函数, cmd存在则调用相应函数, 输入空格则退出
问题
重复注册

如果一个函数使用同样的cmd名注册, 就等于覆盖原有cmd到fn之间的关系, 这样的判断也是合理的, 不过也可以加一个判断, 如果key 已存在, 重复注册抛出异常, 具体情况具体分析
注销

有注册就应该有注销, 从字典中移除.
一般来说注销是有条件的, 什么人拥有注销权限看业务需求
完善命令分发器
实现函数可以带任意参数(可变参数除外), 解析参数并要求用户输入
即实现下面的问题 :

@reg('x')
def foo1(x, y):
print('text', x, y)br/>@reg('pyt')
def foo2(a, b=100):
print('python', a, b)
基本思路 :

可以有以下两种方式 :
注册的时候固定死, @reg(‘pyt’, 200, 100), 可以认为@reg(‘pyt’, 200, 100) 和 @reg(‘pyt’, 300, 100) 是不同的函数, 可以用partial 函数
运行时,在输入cmd 的时候, 逗号或者空格分割, 获取参数, 函数验证功能在后面实现
一般用户都喜欢使用单纯一个命令如 pyt, 然后直接显示想要的结果,采用方式一实现

def command_dispatcher():

# 构建全局字典
cmd_tbl = {}

# 注册函数
def reg(cmd, *args, **kwargs):
    def _reg(fn):
        cmd_tbl[cmd] = fn, args, kwargs
        return fn
    return _reg

# 缺省函数
def default_func(*args, **kwargs):
    print('Unknow command')

# 调度器
def dispatcher():
    while True:
        cmd = input('Please input cmd >>')

        # 退出条件
        if cmd.strip() == '':
            return

        fn, args, kwargs = cmd_tbl.get(cmd, (default_func, (), {}))
        fn(*args, kwargs)
return reg, dispatcher

reg, dispatcher = command_dispatcher()

@reg('x1', z=200, y=300, x=100)
@reg('x2', z=300, y=300, x=300)
@reg('x3', 1, 2, 3)
def foo1(x, y, z):
print('text', x, y, z)

dispatcher()
输出结果 :

Please input cmd >> x1
text 100 300 200
Please input cmd >> x2
text 300 300 300
Please input cmd >> x3
text 1 2 3
Please input cmd >>
方法二 :

def command_dispatcher():
command = {}
def reg(cmd):
def _reg(fn):
command[cmd] = fn
return fn
return _reg
def default_fn(*args, kwargs):
print('Unknow command')
def dispatcher():
while True:
cmd = input('Please input cmd >>')
if cmd.strip() == '':
break
else:
fname, params = cmd.replace(',', ' ').split()
args = []
kwargs = {}
for param in params:
lis_param = param.split('=', maxsplit=1)
if len(lis_param) == 1:
args.append(lis_param[0])
elif len(lis_param) == 2:
kwargs[lis_param[0]] = lis_param[1]
command.get(fname, default_fn)(
args,
kwargs)
return reg, dispatcher
reg, dispatcher = command_dispatcher()

@reg('x')
def foo1(x, y):
print('text', x, y)

@reg('pyt')
def foo2(a, b=100):
print('python', a, b)

dispatcher()

输出结果 :

Please input cmd >> x 1 2
text 1 2
Please input cmd >> x x=1,y=4
text 1 4
Please input cmd >> pyt 5
python 5 100
Please input cmd >> pyt 4 8
python 4 8


--结束END--

本文标题: Python 异常处理

本文链接: https://www.lsjlt.com/news/183899.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 异常--python异常处理
    --****--python 异常处理------------------------------------------------------------------------------****DB API中定义了一些数据库操作的错...
    99+
    2023-01-31
    异常 python
  • Python -- 异常处理
    当一个小人物冲向大时代,有多少伤害埋伏左右;      -- 北岛《城门开》当一个大梦想埋于小身体,有多少潜能冲破束缚。      -- 小Q 《梦想家》-------------------------------------------...
    99+
    2023-01-31
    异常 Python
  • python异常处理
    import re,random,traceback kk ='<img src="//kanimg.9ku.com/Article/20170727/1501135687683763.gif" alt="不要惹怒胖子,后果自己看"&...
    99+
    2023-01-31
    异常 python
  • Python 异常处理
    写一个命令分发器初步要求 : 程序员可以方便地注册函数到某一个命令, 用户输入命令时, 路由到注册的函数, 如果此命令没有对应的函数, 执行默认函数分析 : 输入命令映射到一个函数, 并执行这个函数, 应该是cmd_tbl[cmd] = f...
    99+
    2023-01-31
    异常 Python
  • Python——异常处理
    文章目录 异常Python中的异常类捕获与处理异常自定义异常类with语句断言 异常 异常是在程序执行过程中发生的影响程序正常执行的一个事件。异常是Python对象,当Python无法...
    99+
    2023-09-04
    python 开发语言 pycharm
  • python try异常处理
    错误和异常: 错误: nameerror 未声明、初始化对象 indexerror 序列中没有此索引 syntaxerror 语法...
    99+
    2023-01-31
    异常 python
  • Python 之异常处理
    一 错误和异常 •错误分两种: 1、语法错误 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # 举列 4 print('hello world' # 少) 5 6 def ...
    99+
    2023-01-30
    异常 Python
  • Python之异常处理
    错误包括语法错误和逻辑错误 异常是程序运行时发生错误的信号,解释器追踪程序,根据错误抛出的异常。 常用的异常: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError 输入/输出异常...
    99+
    2023-01-30
    异常 Python
  • python的异常处理
    1.1什么是异常?异常时程序发生错误的信号,一旦程序出错机会产生一种类型的异常,1.2为什么要处理异常?为了保证程序的健壮性1.3怎么处理异常?语法错误:程序运行前就应该解决逻辑错误:try…except1.4五种异常处理语法:异常处理一:...
    99+
    2023-01-31
    异常 python
  • Python 进阶:异常处理
    异常是什么 Python 使用异常对象来表示异常状态,并在遇到错误时引发异常。异常对象未被处理(或捕获)时,程序将终止并显示一条错误消息(traceback)。 如果异常只能用来显示错误消息,就没多大意思了。但事实上,每个异常都是某个类的实...
    99+
    2023-09-29
    python 开发语言
  • 6 Python的异常处理
    概述         在上一节,我们介绍了Python的面向对象编程,包括:类的定义、类的使用、类变量、实例变量、实例方法、类方法、静态方法、类的运算符重载、继承等内容。在这一节中,我们将介绍Python的异常处理。异常是指程序在运行过程中...
    99+
    2023-09-18
    python 异常处理 错误与异常
  • python异常处理--try...except
    在python中,用try来测试可能出现异常的语句,然后用except来处理可能出现的异常,try except的表达形式如下:try:    语句except [exception,[data...]]:  ...
    99+
    2023-01-30
    异常 python
  • python应用:异常处理
      Python的错误异常在大部分IDE编辑器中则可以直接显示出来,便于开发人员的调试及修改工作,对初学者也比较友好。   Python中包含错误和异常两种情况,错误主要是常见的语法错误SyntaxError,并且在错误提示中会有倒三角箭...
    99+
    2023-01-30
    异常 python
  • Python异常处理详解
    在shell脚本中,常用if来判断程序的某个部分是否可能会出错,并在if的分支中做出对应的处理,从而让程序更具健壮性。if判断是异常处理的一种方式,所有语言都通用。对于特性完整的编程语言来说,都有专门的异常处理机制,有些语言用起来可能会很...
    99+
    2023-01-30
    详解 异常 Python
  • Python 中的异常处理
    异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。在Python中,和不部分高级语言一样,使用了try/except/finally语句块来处理异常,如果你有其他...
    99+
    2023-01-31
    异常 Python
  • Python基础:异常处理
    如何处理异常   无论发生什么情况,finally block 中的语句都会被执行,哪怕前面的 try 和 excep block 中使用了 return 语句。 import sys try: f = open('file....
    99+
    2023-01-31
    异常 基础 Python
  • python 异常处理总结
    最近,做个小项目经常会遇到Python 的异常,让人非常头疼,故对异常进行整理,避免下次遇到异常不知所措,以下就是对Python 异常进行的整理。 1.Python异常类 ...
    99+
    2022-06-04
    异常 python
  • Python学习 :异常处理
      异常处理   什么是异常处理   - python解释器检测到错误,触发异常(也允许程序员自己触发了异常)   - 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,只与异常处理有关)   - 如果捕捉成功则进入另外...
    99+
    2023-01-30
    异常 Python
  • python3:Python 异常处理以
    try …except…else 语句 是处理异常公式, try 是有可能抛异常的代码块, except 抓取异常的类型, else 是指当没有抓到抛错,就运行这块代码。请看下下边的例子: try: print("抓取的有...
    99+
    2023-01-31
    异常 Python
  • 分析Python异常处理
    本篇内容主要讲解“分析Python异常处理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析Python异常处理”吧!  “你不可能总是对的”  甚至计算机也会有失误的时候。当然程序员也不例外,...
    99+
    2023-06-01
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作