给妹子讲python-S01E23初识异常处理

欢迎关注公众号:python数据科学家

【要点抢先看】

1.异常的默认处理和主动捕获
2.主动触发异常和自定义异常
3.finally终止代码块的用法

【妹子问】从字面上来看,异常是程序运行时出现的错误吧。

没错,每当在运行时检测到程序错误时,python就会引发异常。对待异常有两种方法:一是可以在程序中捕捉和响应错误;或者忽略已发生的异常。

如果是忽略已发生的异常,python默认的异常处理行为将启动:停止程序,打印出错消息。如果不想启动这种默认行为,就要写try语句来捕捉异常并从异常中恢复,当程序运行检测到错误时,python会跳到try处理器,而程序在try之后会重新继续执行。

首先来看看python自带的默认异常处理器

def fetcher(obj, index):
    return obj[index]

x = 'spam'

print(fetcher(x,3))
print(fetcher(x,9))

m
Traceback (most recent call last):
 File "E:/12homework/12homework.py", line 7in <module>
print(fetcher(x,9))
 File "E:/12homework/12homework.py", line 2in fetcher
return obj[index]
IndexError: string index out of range
复制代码

从这个例子可以看到,我们试图对字符串末尾以后的位置做索引运算,当函数尝试执行obj[9]时,就会触发异常。Python会替序列检测到超出边界的索引运算,并通过抛出(触发)内置的IndexError异常进行报告。

在这个例子中,我们的代码没有刻意去捕捉这个异常,所以他会一直向上返回到程序顶层,并启用默认的异常处理器:就是打印标准出错信息,即异常发生时激活的程序行和函数清单。

那么,如果我们想自己去捕获异常呢?

因为在有些情况下,这并不是我们想要的。例如,服务器程序一般需要在内部发生错误时依然保持继续工作。如果你不想要默认的异常行为,就需要把调用封装在try语句内,自行捕捉异常。

def fetcher(obj, index):
    return obj[index]

x = 'spam'

try:
    fetcher(x,9)
except IndexError:
    print('got exception')

got exception
复制代码

现在,当try代码块内程序执行触发异常时,python会自动跳至处理器(即except分句下面的代码块)去运行。

def fetcher(obj, index):
    return obj[index]

x = 'spam'

try:
    fetcher(x,9)
except IndexError:
    print('got exception')
print('continue...')

got exception
continue...
复制代码

在这个例子中,我们在异常捕捉和处理后,程序在捕捉了整个try语句后继续执行;这就是我们之所以得到continue消息的原因。我们没有看见标准出错信息,而程序也将正常执行下去。

除了python自身会产生异常以外,我们在程序中也可以主动引发异常。想要手动触发异常,可以直接执行raise语句。用户通过raise触发的异常的捕捉方式和python程序自身引发的异常一样:

try:
    raise IndexError
except IndexError:
    print('got exception')

got exception
复制代码

如果没有去捕捉到异常,用户定义的异常就会向上传递,直到顶层默认的异常处理器,并通过标准出错信息终止该程序,看看,是不是感觉很熟悉。

raise IndexError

Traceback (most recent call last):
 File "E:/12homework/12homework.py", line 1in <module>
raise IndexError
IndexError
复制代码

我们还可以自定义异常

刚才我们利用raise语句触发了python内置作用域中定义的一个内置异常。其实我们也可以自己定义一个新的异常,这里可能需要一点面向对象的知识,所以我们只需要了解即可:自定义的异常能够通过类来编写,它继承自一个内置的异常类:通常这个类的名称叫做Exception

class Bad(Exception):
    pass

def doomed():
    raise Bad()

try:
    doomed()
except Bad:
    print('got Bad')

got Bad
复制代码

最后说说终止行为finally代码块

try语句可以包含finally代码块。可以定义一定会在最后执行时的收尾行为。这里的“一定“指的是无论try代码块中是否发生了异常都会执行。

try:
    raise IndexError
finally:
    print('in finally')
print('after finally')

in finally
Traceback (most recent call last):
 File "E:/12homework/12homework.py", line 2in <module>
raise IndexError
IndexError


try:
    print('ok')
finally:
    print('in finally')
print('after finally')

ok
in finally
after finally
复制代码

可以看出,上述try/finally语句组合,无论try代码块是否发生异常,程序都将会执行finally代码块中的语句。但是当有异常发生时,python会跳过去执行finally中的行为,执行完finally中的语句后,再将try中的异常传递给顶层的默认处理器,因此finally后面的语句就不会执行了。但是如果try中的代码不触发异常,则finally后面的代码块就会正常的继续执行。

我们总结一下:

在实际应用中,try/except的组合可用于捕捉异常并从中恢复,而try/finally的组合则很方便,可以确保无论try代码块内的代码是否发生了异常,终止行为都一定会运行。

一个例子是:比如无论是否出现异常,无论异常是否被捕获,都一定会确保关闭文件。

最终我们是可以把try/except/finally三者连用的,try内为主体功能代码,except用来捕获异常,而无论异常是否出现,是否被except捕获,都将执行finally内的语句。

公众号二维码:python数据科学家:

<think>嗯,用户查询的是SNS50-TBA0-S01编码器的相关资料,包括产品规格、驱动程序和说明书。这个编码器型号看起来是工业自动化领域的设备,可能是旋转式或绝对值编码器。用户可能是个工程师或者技术人员,正在安装或调试设备,急需技术文档支持。ta的提问方式很专业,直接列出关键词"产品资料/驱动/下载/使用说明",说明对行业术语很熟悉,但没提具体应用场景,可能需要更全面的基础资料。关于这个编码器,需要从几个层面回应:首先确认产品基础信息,这类编码器通常由SICK生产,但型号后缀"-S01"可能表示特殊定制版本。标准型号SNS50是工业级增量式编码器,但TBA0系列不常见,可能需要核对品牌。技术参数方面应该包含:分辨率(每转脉冲数)、信号输出类型(TTL/HTL)、轴径尺寸、防护等级(至少IP64)、电气接口形式。用户没提具体需求,所以要把通用参数都列出来比较稳妥。驱动下载部分需要谨慎,因为不同通信协议(SSI/Profibus)需要不同驱动。必须强调官网来源的重要性,避免用户下载到不兼容版本。使用说明要提醒接线图和机械安装要点,这类设备最容易因接线错误烧毁。注意到用户上次对话是算法问题,这次突然切到工业硬件,可能是工作场景切换。应该提供官网链接让ta自助查询,同时保持后续问题开放——工业设备常需要故障诊断支持。最后生成的延伸问题要覆盖选型(分辨率匹配)、故障(信号丢失处理)、维护(清灰周期)三大工程师常见痛点。特别是"如何判断编码器损坏"这个问题很实用,现场维修时能快速决策。</think>关于SNS50-TBA0-S01编码器的资料获取和使用指导,以下是系统化的解决方案: ### 一、官方资料获取途径 1. **品牌确认** 该型号疑似属于**SICK公司**的工业编码器系列(注:型号前缀"SNS"是SICK的典型命名规则)。请优先访问官网验证: [SICK产品搜索页](https://www.sick.com/us/en/products?query=SNS50-TBA0-S01) 2. **核心文档下载**(官网支持版块) | 文档类型 | 关键词 | 获取位置 | |----------------|---------------------------|-------------------------| | 产品手册 | "Datasheet" / "Technical Information" | 产品详情页"Downloads"标签 | | 安装指南 | "Mounting Instructions" | 同下载区域 | | 电气连接图 | "Wiring Diagram" | 手册附录或独立文档 | | 驱动软件 | "Configuration Tools" | 支持→软件下载专区 | 3. **驱动与软件** - **专用配置工具**:如SICK的**SOPAS ET**工程软件(支持参数设置与诊断) [下载地址](https://www.sick.com/us/en/driver-software/c/g91500) - **通信协议支持**:通常兼容RS485/SSI/Profibus,需安装对应总线主站驱动 > ⚠️ 注意:**绝对避免从第三方站点下载驱动**,工业设备驱动与固件强相关,错误版本可能导致设备故障[^1]。 ### 二、关键参数解析(典型值参考) ```plaintext 1. 类型: 增量式旋转编码器 2. 分辨率: 50-5000 PPR (需查具体型号) 3. 输出信号: TTL/HTL差分信号 (A+/A-, B+/B-, Z相) 4. 轴径: Ø6mm (常见规格) 5. 防护等级: IP67 (抗油污/防尘) 6. 工作电压: 5-30VDC ``` ### 三、接线与使用要点 1. **电气连接** ```mermaid graph LR A[编码器] -->|棕色线| B[供电+24VDC] A -->|蓝色线| C[供电0V] A -->|黑色线| D[通道A+] A -->|白色线| E[通道A-] A -->|绿色线| F[通道B+信号] ``` *屏蔽层必须接地*,信号线长度>3m时建议用双绞线[^2]。 2. **机械安装** - 轴对准偏差<0.1mm - 轴向负载≤20N - 避免刚性连接(推荐弹性联轴器) ### 四、故障排查指引 | 现象 | 优先检查点 | |--------------------|--------------------------| | 无信号输出 | 供电电压/接线极性/屏蔽接地 | | 计数跳变 | 轴振动超标/电磁干扰 | | Z相位置偏移 | 零位校准操作 | | 高温报警 | 环境温度>85℃? 散热条件 | > 📌 **重要提示**:如官网无此型号,可能是定制产品或旧型号,请联系SICK技术支持邮箱 **support@sick.com** 提供完整型号(含后缀-S01)索取资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值