我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python 异常处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python 异常处理

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

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

输入命令映射到一个函数, 并执行这个函数, 应该是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


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python 异常处理

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

下载Word文档

猜你喜欢

异常--python异常处理

--****--python 异常处理------------------------------------------------------------------------------****DB API中定义了一些数据库操作的错
2023-01-31

Python -- 异常处理

当一个小人物冲向大时代,有多少伤害埋伏左右;      -- 北岛《城门开》当一个大梦想埋于小身体,有多少潜能冲破束缚。      -- 小Q 《梦想家》-------------------------------------------
2023-01-31

python异常处理

import re,random,tracebackkk ='不要惹怒胖子,后果自己看'p =
2023-01-31

Python 异常处理

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

Python之异常处理

错误包括语法错误和逻辑错误异常是程序运行时发生错误的信号,解释器追踪程序,根据错误抛出的异常。常用的异常:AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError 输入/输出异常;基本上是
2023-01-30

Python 之异常处理

一 错误和异常•错误分两种:1、语法错误1 #!/usr/bin/env python2 # -*- coding:utf-8 -*-3 # 举列4 print('hello world' # 少)5 6 def test: # 少()
2023-01-30

python的异常处理

1.1什么是异常?异常时程序发生错误的信号,一旦程序出错机会产生一种类型的异常,1.2为什么要处理异常?为了保证程序的健壮性1.3怎么处理异常?语法错误:程序运行前就应该解决逻辑错误:try…except1.4五种异常处理语法:异常处理一:
2023-01-31

python try异常处理

错误和异常: 错误: nameerror 未声明、初始化对象 indexerror 序列中没有此索引 syntaxerror 语法错误
2023-01-31

python3:Python 异常处理以

try …except…else 语句是处理异常公式, try 是有可能抛异常的代码块, except 抓取异常的类型, else 是指当没有抓到抛错,就运行这块代码。请看下下边的例子:try: print("抓取的有可能的代码块")
2023-01-31

分析Python异常处理

本篇内容主要讲解“分析Python异常处理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析Python异常处理”吧!  “你不可能总是对的”  甚至计算机也会有失误的时候。当然程序员也不例外,
2023-06-01

python异常处理--try...except

在python中,用try来测试可能出现异常的语句,然后用except来处理可能出现的异常,try except的表达形式如下:try: 语句except [exception,[data...]]: Do somethingexcep
2023-01-30

python应用:异常处理

Python的错误异常在大部分IDE编辑器中则可以直接显示出来,便于开发人员的调试及修改工作,对初学者也比较友好。  Python中包含错误和异常两种情况,错误主要是常见的语法错误SyntaxError,并且在错误提示中会有倒三角箭头的修改
2023-01-30

Python异常处理详解

在shell脚本中,常用if来判断程序的某个部分是否可能会出错,并在if的分支中做出对应的处理,从而让程序更具健壮性。if判断是异常处理的一种方式,所有语言都通用。对于特性完整的编程语言来说,都有专门的异常处理机制,有些语言用起来可能会很复
2023-01-30

Python学习 :异常处理

异常处理  什么是异常处理  - python解释器检测到错误,触发异常(也允许程序员自己触发了异常)  - 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,只与异常处理有关)  - 如果捕捉成功则进入另外一个处理分支,
2023-01-30

Python 中的异常处理

异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。在Python中,和不部分高级语言一样,使用了try/except/finally语句块来处理异常,如果你有其他
2023-01-31

Python基础:异常处理

如何处理异常  无论发生什么情况,finally block 中的语句都会被执行,哪怕前面的 try 和 excep block 中使用了 return 语句。import systry: f = open('file.txt', '
2023-01-31

python 异常处理总结

最近,做个小项目经常会遇到Python 的异常,让人非常头疼,故对异常进行整理,避免下次遇到异常不知所措,以下就是对Python 异常进行的整理。 1.Python异常类 异常描述NameError尝试访问一个没有申明的变量ZeroDivi
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录