class="hljs-ln-code"> class="hljs-ln-line">    <代码块1>
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">except:
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">    <代码块2>
  • class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    上述结构中,<代码块1>中一般是一些容易“报错”的代码,如果<代码块1>中的代码能够正常运行,那么程序就会逃过<代码块2>去执行后续的其他代码;而<代码块2>中的代码一般是<代码块1>错时的应对措施。总的来说,如果<代码块1>能正常运行,那么皆大欢喜;但如果<代码块1>中的代码出现异常,那么程序就会执行<代码块2>中的代码,而不是直接报错和终止程序。(如果<代码块2>中的代码是 pass,则代表忽略这个异常。)

    以上是try-except语句的基本结构,也是最常用的结构,简单粗暴易懂。但当程序变得复杂时,可能就需要更加精准地针对不同类型的异常实施不同的解决方案,这种更复杂的异常处理结构如下:

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">try:
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">    <代码块1>
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">except 异常类型1:
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">    <代码块2>
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">except 异常类型2:
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">    <代码块3>
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">except 异常类型3:
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">    <代码块4>
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">    ……
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">except Exception:
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">    <代码块N>
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    这种结构可以对指定的异常类型分配不同的处理方式,当<代码块1>中出现异常类型1时,程序就会执行<代码块2>,当<代码块1>中出现异常类型2时,程序就会执行<代码块3>……如果抛出的异常类型不属于任何一种已写明的异常,那么都会被归入异常类基类 Exception 中,进而执行<代码块N>

    除此之外,try-except还有一些其他结果,包括try-except-elsetry-except-else-finally。这些结果能够实现更多异常处理功能,让代码结构更加清晰,但笔者认为上述两种结果已经足够帮助我们解决 99% 的实际问题了,所以本文就不再对这两种结构多做介绍。

    三、哪些情况下需要使用 try-except ?

    1. 使用易报错函数时

    在使用 OCR 技术识别表格时,得到的表格中,每个单元格中的值都是字符串,因我们需要将存放数值的单元格内容转为数字类型,这就要用到 Python 内置函数 eval()。但是 OCR 识别结果可能会出现少许错误,例如原始数据中的数字 “3.15” 被识别为 “3·15”,那么这个数字就无法被 eval() 函数转为数字,进而抛出异常(eval 函数遇到无法转换的字符时会直接报错而不是返回其他值)。如果我们在转换类型时不希望个别异常数据打断程序的正常运行,那么我们就可以编写一个函数来进行转换,这个函数的功能是,如果输入的字符串可以被转为数字,那么就返回转化结果,如果不可以被转换,那么就输出提示性文字并返回特殊标记,后续再人工核查。

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">def try_eval(Str):
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">    try:
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">        # 尝试直接返回转换后的值
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">        return eval(Str)
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">    except:
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">        # 若无法正常转换,输出提示文字并返回特殊标记
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">        print(f'输入值【{Str}】无法被正常转换')
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">        return '--'
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    因此在应用转换函数时使用优化后的函数,就可以避免程序频繁报错。

    2. 使用网络请求数据时

    很多时候我们需要使用 Python 从网站或服务器中获取数据,例如在采集数据或调用网络服务 API 时。笔者在使用高德地图或者百度地图的地理服务 API 时,请求数据的函数中一般都会使用多层try-except 来规避程序报错。

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">def revfunc(df):
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">    lng = df['LNG1']
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">    lat = df['LAT1']
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">    if lng != '':
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">        # 若 经纬度 不为空
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">        GD_inv = GD.regeocode_by_lonlat(lng, lat)
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">        try:
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">            # 若返回状态正常
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">            if GD_inv['status'] == '1'
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">                try:
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">                    # 根据经纬度返回省份、地市、区县、行政区划代码
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">                    return GD_inv['regeocode']['addressComponent']['province'],\
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">                           GD_inv['regeocode']['addressComponent']['city'],\
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">                           GD_inv['regeocode']['addressComponent']['district'],\
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">                           GD_inv['regeocode']['addressComponent']['adcode']
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">                except:
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">                    return '','','',''
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">            else:
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">                return '','','',''
    20. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">        except:
    21. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="21"> class="hljs-ln-code"> class="hljs-ln-line">            return '','','',''
    22. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="22"> class="hljs-ln-code"> class="hljs-ln-line">    else:
    23. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="23"> class="hljs-ln-code"> class="hljs-ln-line">        # 若 经纬度 为空
    24. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="24"> class="hljs-ln-code"> class="hljs-ln-line">        return '','','',''
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    因为这些程序在运行时不仅需要稳定的网络环境,还对输入值有着较为严格的要求,所以出现异常的几率非常之高。因此我们可以使用异常处理结构增加程序稳定性。

    3. 分批处理大数据集时

    使用 Python 大数据集时,由于计算机(运行)内存空间不足以装载整个数据集,往往需要分批处理,将数据集分成 N 个数据块,每次处理一块数据。如果数据集非常大,同时处理步骤也比较复杂,那么整个程序可能要持续运行数个小时,这就对程序的稳定性有着非常高的要求。如果某个数据块中出现异常数据导致程序中断,我们可能不会立即察觉,后续要重新启动程序,费时费力。在这种情况下,也建议大家使用异常处理结构,防止异常造成程序中断。当然,在此情况下我们还需要做好异常应对策略,不能完全忽略异常的发生,因为这很可能让我们丢失数据。

    4. ……

    如果您觉得数据处理时还有某些场景比较依赖try-except,欢迎在留言区留言分享。

    四、异常处理注意事项

    在使用try-except语句时,不能在所有情况下都使用忽略异常这个思路。尤其是在分批处理大数据集时,如果一个数据块在被处理时发生异常,尽管其有着异常处理的代码,但最终这个数据块可能还是没有被成功处理。所以我们一定要在except语句下编写合适的应对代码,例如遇到无法处理的数据块时,先将其单独保存下来,待大部分数据处理完成后,再对这些问题数据进行单独操作。

    不仅如此,有些时候我们还需要记录详细的报错信息,并使用日志库将其记录下来,事后分析异常原因,防止后续再次踩坑。

    总结

    💡Python的异常处理语句try-except提供了一种有效的方式来处理代码中可能出现的异常情况。通过正确地使用try-except,我们可以提高代码的健壮性和可靠性,避免程序崩溃,并且更好地掌控程序流程。同时,我们也应该注意异常处理的细节和注意事项,以保证我们的代码在出现异常时能够正确地响应和处理。

    如果你想学习各种 Python 编程技巧,提升个人竞争力,那就加入我们的数据 Seminar 交流群吧,欢迎大家在社群内交流、探索、学习,一起进步!同时您也可以分享通过数据 Seminar 学到的技能以及得到的成果。

    相关推荐

    Python 教学

    Python实战

    数据可视化

    data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/weixin_55633225/article/details/136807688","extend1":"pc","ab":"new"}">>
    注:本文转载自blog.csdn.net的企研数据的文章"https://blog.csdn.net/weixin_55633225/article/details/136807688"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
    复制链接

    评论记录:

    未查询到任何数据!