V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yezheyu
V2EX  ›  Python

请教下老哥,实际开发中哪些地方必须使用 try...except...

  •  
  •   yezheyu · 224 天前 · 2977 次点击
    这是一个创建于 224 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新手,务笑!

    我知道 try 使用范围是在你觉得可能出错的地方使用,但实际开发中,哪些算是呢?

    常常忘记使用 try (除了那些自己设计的异常类,需要手动捕获的)

    我知道的有涉及到文件打开读写,数据库的读写

    还有哪些现实开发中需要使用 try 的地方吗?

    29 条回复    2021-03-18 16:59:38 +08:00
    knightdf
        1
    knightdf   224 天前
    就好比你现在上网,你怎么知道一定能打开网页呢?你得 try 吧,万一你网线断了,你网络不通,你网太慢打开超时了, 或者你打开的网页内容不对,看不懂,这不都是可能出的错么
    acmore
        2
    acmore   224 天前
    例如网络请求,数据解析,格式转换等方面都常用。

    核心不在于找到错误而是在于:
    1. 解决错误( retry, bypass, default value ...)使程序回到正常流程;
    2. 尽早通知用户发生了需要人为介入处理的情况;
    huijiewei
        3
    huijiewei   224 天前   ❤️ 8
    非自己可控的数据流
    zhaorunze
        4
    zhaorunze   224 天前   ❤️ 1
    不是你写的代码都需要
    Orenoid
        5
    Orenoid   224 天前   ❤️ 1
    当你不希望不可控的错误一路上抛到程序最顶层的时候
    Pagliacii
        6
    Pagliacii   224 天前
    当你需要调用代码,而又没有办法确保被调用的代码能正确执行时,就需要用捕获可能出现的异常。然后调用方再做相应的处理。
    MeteorCat
        7
    MeteorCat   224 天前 via Android
    网络请求最明显,你永远不知道是断网还是 dns 出错或者啥奇奇怪怪的原因
    touchwithe
        8
    touchwithe   224 天前 via iPhone
    总结一下就是各种 io 操作,包括但不限于网络请求、文件读者、数据库 crud...
    ebingtel
        9
    ebingtel   224 天前   ❤️ 1
    1 、不想导致本 进 /线 /协 程挂掉的
    2 、不想暴露底层错误细节的
    QBugHunter
        10
    QBugHunter   224 天前
    try
    openFile
    catch

    要是这个文件不存在肿么办?要是这个文件没有权限肿么办?要是文件类型错误肿么办?
    darksword21
        11
    darksword21   224 天前 via iPhone
    直接用 go
    no1xsyzy
        12
    no1xsyzy   224 天前
    调用不是你写的代码,并且不接受上抛的情况
    walpurgis
        13
    walpurgis   224 天前
    其实对于这类设计问题最好是去研究为什么这样设计,解决了什么问题,而不是记住什么时候用,可以搜一下没有异常处理的语言是怎么处理的
    xuanbg
        14
    xuanbg   224 天前
    不希望抛出异常的时候
    maloneleo88
        15
    maloneleo88   224 天前
    写完要试运行啊,肯定 BUG 多多
    不可控的地方都要用。某些时候不仅用一次。

    要 try:
    try:
    try:
    except:
    except:
    except:

    这东西永远无法预估,就是一个不断解决问题的过程。

    我学的过程就是,稀里糊涂写了几百行代码。所有函数全在一起,运行起来都要卡机(因为用 pycharm 打开的)。然后就是 bug 重重,然后不断的改,不会的就出来问,好心人还是很多的。(过嘴瘾的也有,不理就好了。)

    然后就是不断的改,修,补,一直到最后,学着把各个功能归类,分装到不同的模块,慢慢就有条理了。也理解了刚开始一直弄不明白的面对对象而非面对流程。

    然后就舒服多了。主程序空壳一个,加一些基本的东西和注释。
    各个模块有各个模块的作用,各个函数有各个函数的功能。
    没什么 BUG 了,即使有,秒找出来。因为清晰了,有个宏观的概念了。也不用牵一发动全身了。

    要俯视这件事情,不要置身其中。

    我这段时间的学习经验。

    先动手吧,真有问题再问,而不是预计会有什么问题。能预估到的问题都不是问题。

    为一个目的而去做一件事,而不是把这件事看懂了,再去做。 因为永远都不能置身事外看懂内在。
    renmu123
        16
    renmu123   224 天前 via Android
    Python 的 try 是非常轻量的操作,社区甚至推崇用 try 来代替一定的 if
    maloneleo88
        17
    maloneleo88   224 天前
    就算没有用到的地方,我也认为尽量把程序写进 try 里,保证其他部分的程序可以正常运行。。。我抓数据,基本用了无数个 try, 各种突发情况简直措不及防。 :DDDD
    pastgift
        18
    pastgift   224 天前 via iPhone
    也有取深层 json 字段,但结构可能不正确的时候

    try:
    data = j['a']['b']['c']
    except KeyError as e:
    data = None

    if data is None:
    pass
    WhiteDragon96
        19
    WhiteDragon96   224 天前
    一般我会把所有的业务都写 try catch
    jzmws
        20
    jzmws   224 天前
    外部的 , 不是主要业务流程 (失败了有补偿机制的)
    mumbler
        21
    mumbler   224 天前 via Android
    无法预料的输入
    sudoy
        22
    sudoy   224 天前
    楼上正解,无法预料输入的时候一般用 try
    ClericPy
        23
    ClericPy   224 天前
    必不必须我不知道, 遇到层层嵌套的函数或者条件, 普通的 return 或者 break 已经无法跳出去的时候, 我就直接自定义个 Exception 然后 raise 出去... 比如深层 retry

    我就是这么骚气
    Variazioni
        24
    Variazioni   223 天前
    还是经验太少。。写个两年代码你自然就明白了。。。
    beichenhpy
        25
    beichenhpy   223 天前
    @WhiteDragon96 慢的要死,try 有额外开销
    l4ever
        26
    l4ever   223 天前
    知道可能会有出错的风险就 try
    aeron
        27
    aeron   223 天前
    @renmu123 卧槽,我就是这么干的
    ch2
        28
    ch2   223 天前
    当你的系统必须为不可靠的输入输出买单,而你又不知道到底会出现什么不靠谱的情况的时候
    cominghome
        29
    cominghome   223 天前
    有两种情况,
    1. 知道这里可能会出错,并且这个错误有办法处理,就针对性地 catch 起来
    2. 不知道这里会不会出错,但是不希望错误扩散,就套一个大的 Exception 都抓起来
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1268 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:19 · PVG 07:19 · LAX 16:19 · JFK 19:19
    ♥ Do have faith in what you're doing.