一木.溪桥学Python-14 异常捕获

本文介绍了Python中的异常概念、捕获方法,包括try-except结构,异常类型捕获,以及如何自定义和使用异常。通过实例演示了如何处理输入错误、特定异常类型识别和自定义OldAmyError异常。同时,提到了断言在强制用户遵循规则中的应用。

一木.溪桥 在Logic Education跟Amy学Python

逻辑教育 :https://logicedu.ke.qq.com

12期:Python基础课

一木.溪桥学Python-14:异常捕获

日期:2021年1月19日

  • 本文内容:来至Amy老师的语雀分享!在此表示感谢!

学习目标:

  • 异常
  • 异常捕获

学习内容:

异常

介绍
  • 当Python无法正常处理程序时就会发生一个异常,会影响程序的正常执行。

    异常也是Python对象,表示一个错误。

异常捕获
  • 当Python脚本有发生异常的可能时,就需要捕获异常,避免程序终止执行。
语法
try:
    正常程序执行此块代码
except:
    抛出错误执行此代码块
练习
  • 将以下代码进行异常捕获
  • 当代码异常时,将ipt赋值为1
ipt = input("请输入:")
ipt = float(ipt)
print(ipt)
  • 代码如下:
try:
    # 正常程序时执行代码块
    ipt = input("请输入:")
    ipt = float(ipt)
    print(ipt)

except:
    # 异常程序时执行代码块
    ipt = 1
    print(ipt)
异常类型捕获
  • 但是仅仅使用以上异常捕获,虽然不会报错终止程序。但是无法记录下具体异常种类。如需记录下具体异常种类,则需要捕获该具体异常。

  • 语法:

try:
    pass
except 当前异常对象 as e:  # e = 当前异常对象 
    print(e)   			  
  • 练习
  • 捕获以下代码的异常类型并输出
li = [1, 2, 3]
li[3]  # IndexError
  • 代码如下:
try:
    li = [1, 2, 3]
    li[3]  # IndexError
except IndexError as e:  
    print(e)           # list index out of range
  • 需要注意的是,该捕获方式仅能捕获IndexError这一类异常。那么实际上,这种细分的异常种类有很多,可以通过其共同父类Exception捕获输出。
try:
    # li = [1,2,3]
    # li[3]
    int('a')
except Exception as e:
    print(e)   		   # invalid literal for int() with base 10: 'a'
try-except-else
  • 如果抛出异常执行except内部代码
  • 如果程序正常执行else内部代码
try-finally

不管程序有无发生异常,都将执行finally内部代码。

主动触发异常

在实际开发中,在程序不满足某条件时,通常会主动抛出异常。

  • 语法
raise Exception()
  • 练习

    判断煎饼熟了没,当烹饪时间小于5时,则主动触发没熟异常;否则熟了。

def test(level):
    if level<5:
        raise Exception("没熟没熟")


try:
    test(5)               
except Exception as e:
    print(e)             
else:
    print("熟了 请吃")    
定义异常
  • 当需要自定义满足一些规则时,就可以自定义异常。

  • 自定义异常通过创建一个新的异常类,自定义名字与内容,并且需要继承Exception类实现。

  • 练习

  • 自定义OldAmyError异常类

class OldAmyError(Exception):
    def __init__(self,msg):
        self.message = msg

    def __str__(self):
        return self.message


# e = OldAmyError("我错了")
# print(e)

try:
    raise OldAmyError("我错了")    
except OldAmyError as e:
    print(e)                     
断言
  • assert断言用于判断一个表达式,当表达式条件为False时触发断言异常AssertionError。一般用于强制用户服从。

  • 当表达式条件不成立时:False,直接抛出异常,AssertionError。

  • 当表达式条件成立时:Ture,执行下面的语句,但失去assert的意义。

  • 注意,断言用于强制用户服从,可捕获,但是一般不捕获。

  • 语法:


assert 断言

print("1"*10)		# 输出:1111111111

assert "2.0" == 2	# False ,一般用于强制用户服从

print("1"*10)		# AssertionError



End !
Best wishes for you!

<think>好的,我现在需要帮助用户解决在Linux上安装python-geohash时由于缺少wheel包而不得不使用legacy setup.py install的问题。用户希望避免这种情况,转而使用wheel包来安装。 首先,我得回忆下用户之前的对话历史。用户之前询问过如何在Linux安装python-geohash,我给出了步骤,包括安装依赖、使用pip安装,处理导入错误等。现在用户遇到了新的问题,涉及wheel包的缺失,导致pip回退到旧的安装方法。这可能是因为python-geohash没有提供预编译的wheel,或者用户的环境中没有安装wheel包,导致pip无法生成wheel,只能使用setup.py。 根据用户提供的引用内容,特别是引用[2]和[3],问题通常出现在项目缺少pyproject.toml且没有安装wheel包时,pip会使用旧的setup.py方式。解决方法可能包括安装wheel包,强制使用PEP 517标准,或者手动构建wheel。 首先,用户需要确保系统中已经安装了wheel包。根据引用[3],安装wheel可以避免使用legacy方法。所以在步骤里,应该先让用户安装wheel。命令是pip install wheel,如果用户使用Python3,可能需要用pip3。 然后,可能需要强制pip使用PEP 517模式,这可以通过--use-pep517选项实现,如引用[2]提到的。所以安装命令应该是pip install --use-pep517 python-geohash。不过,我需要确认这个选项是否适用于当前的情况,或者是否需要其他参数。 另外,用户可能遇到的情况是,即使安装了wheel,但python-geohash本身可能没有提供合适的配置,导致pip仍然无法生成wheel。这时候可能需要用户手动构建wheel。步骤包括下载源码包,使用python setup.py bdist_wheel生成wheel文件,然后安装。但这种方法需要用户先获取源码,可能稍微复杂,但可以作为备选方案。 另外,用户可能需要升级pip本身,因为旧版本的pip可能存在兼容性问题。所以建议用户先升级pip:pip install --upgrade pip。 此外,引用[4]提到另种安装方法是用python setup.py install,但用户想避免这个,所以重点应该放在如何让pip使用wheel。 可能的步骤总结: 1. 安装wheel包。 2. 升级pip到最新版本。 3. 使用--use-pep517选项安装。 4. 如果仍然失败,手动构建wheel。 另外,需要考虑Linux环境下可能的依赖问题,比如是否安装了编译所需的工具,如gcc、python-dev等,这些在之前的回答中已经提到,用户可能已经安装过了,但可能需要再次确认,避免编译时出错。 还要检查python-geohash的PyPI页面,看看它是否提供了wheel分发。如果官方没有提供wheel,那么用户可能需要从源码构建wheel,或者等待维护者提供。但根据用户的情况,可能需要手动处理。 最后,验证安装是否成功,用import geohash测试,如之前的步骤所示。 综上,分步骤的解决方案应包括安装wheel、升级pip、使用PEP 517,以及备选的手动构建方法,并确保系统依赖已安装。</think>### 分步解决方案 #### 步骤1: 安装或更新`wheel`包 Wheel是Python的二进制包格式,可避免使用`setup.py install`的旧安装方式。 ```bash pip install --upgrade wheel # 确保已安装最新版wheel # 若使用Python3且默认命令为pip3: pip3 install --upgrade wheel ``` #### 步骤2: 强制启用PEP 517模式 通过添加`--use-pep517`参数,强制pip使用现代构建系统(避免回退到`setup.py`)[^2]: ```bash pip install python-geohash --use-pep517 ``` #### 步骤3: 安装编译依赖(备用) 若仍提示构建失败,需确保系统已安装编译工具链: ```bash sudo apt-get update sudo apt-get install python3-dev gcc # 提供Python头文件和C编译器[^1] ``` #### 步骤4: 手动构建Wheel并安装(终极方案) 如果上述方法无效,可手动下载源码并构建Wheel: ```bash # 下载源码包 pip download python-geohash --no-binary :all: tar -xzf python-geohash-*.tar.gz # 解压源码 cd python-geohash-*/ # 生成Wheel文件 python setup.py bdist_wheel # 生成.whl文件 # 安装生成的Wheel pip install dist/*.whl # 自动使用二进制包 ``` #### 验证安装 ```python import geohash print(geohash.encode(39.9, 116.4)) # 预期输出类似'wx4g' ``` --- ### 关键问题解析 1. **为何强制使用PEP 517?** PEP 517定义了无需`setup.py`的构建标准,通过`pyproject.toml`声明构建依赖,避免传统安装方式的不稳定性。 2. **手动构建Wheel的作用** 当PyPI未提供预编译Wheel时(如某些库未适配Linux平台),手动构建可生成适配当前系统的二进制包,后续安装无需重复编译[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值