python 如何跳过异常继续执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 如何跳过异常继续执行相关的知识,希望对你有一定的参考价值。

我用try...except...处理异常的时候,只要有一个异常,程序就不继续执行了。比如当我move一个文件的时候,如果目标文件以存在,那么程序就会终止对文件的移动。我现在不想让它终止程序,因为我后面还有需要移动的文件。不能因为一个文件的移动错误,导致后面的文件都无法移动。

下面有两种解决方法,第一种是类似if..else..;另外一种是使用语句来实现继续执行;

方法一:使用try...except...语句,类似于if...else...,可以跳过异常继续执行程序,这是Python的优势

用法如下:

方法二:使用语句来继续执行;

拓展资料

异常处理特点:

1.在应用程序遇到异常情况(如被零除情况或内存不足警告)时,就会产生异常。

2.发生异常时,控制流立即跳转到关联的异常处理程序(如果存在)。

3.如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误信息。

4.可能导致异常的操作通过 try 关键字来执行。

5.异常处理程序是在异常发生时执行的代码块。在 C# 中,catch 关键字用于定义异常处理程序。

6.程序可以使用 throw 关键字显式地引发异常。

7.异常对象包含有关错误的详细信息,其中包括调用堆栈的状态以及有关错误的文本说明。

8.即使引发了异常,finally 块中的代码也会执行,从而使程序可以释放资源。

参考资料来源:百度百科:异常处理

参考技术A

使用try...except...语句,类似于if...else...,可以跳过异常继续执行程序,这是Python的优势

用法如下:

try:            # 可能会出现异常的一段代码
    command_1   # 如果command_1出现异常,则不执行command_1以及之后的语句
    command_2   # command_1如果正常,则会执行
except:         # try中任意一行语句出现异常,直接跳转至except,程序继续运行
    command_3
    command_4

参考技术B # encoding: utf-8

import os
import glob
import shutil

backuptarget = r'E:\backup'
srcpath = r'D:\workspace\Projects\DNCSS\python'

def target_mapper(fullpath):
''' 根据文件名映射目标文件名
path, fname = os.path.split(fullpath)
return os.path.join(backuptarget, fname)

for f in glob.glob(os.path.join(srcpath,'log', '*.log')):
try:
shutil.move(f, target_mapper(f))
except:
continue # 再循环中捕获到异常后要求继续即可本回答被提问者采纳
参考技术C try:
    for file in file_list:
        file.XXXXX
except:
    continue
    
continue是跳过错误的继续执行下一个,而break则是中断当前for循环,看需要选择吧。

Python:如何忽略异常并继续? [复制]

【中文标题】Python:如何忽略异常并继续? [复制]【英文标题】:Python: How to ignore an exception and proceed? [duplicate] 【发布时间】:2010-10-09 03:38:51 【问题描述】:

我的代码中有一个 try...except 块,当抛出异常时。我真的只想继续编写代码,因为在这种情况下,一切仍然可以正常运行。问题是,如果您将 except: 块留空或使用 #do nothing,则会出现语法错误。我不能使用 continue 因为它不在循环中。我可以使用一个关键字来告诉代码继续运行吗?

【问题讨论】:

【参考方案1】:
except Exception:
    pass

Python docs for the pass statement

【讨论】:

except Exception: pass #important 不要吞下其他异常! 这将捕获 SystemExit、KeyboardInterrupt 和其他您可能不想捕获的东西。 它不会捕获键盘中断。例如:while True:try: f = open('filedoesnotexist.txt')`except:passKeyboardInterrupt 停止并退出代码。 @ChthonicProject 一个裸露的except 将捕获任何异常,包括键盘中断,但前提是它发生在try 内。在您的示例中,KeyboardInterrupt 可能发生在try 之前或except 内部,不会被捕获。如果您运行像while True: try: pass except: pass 这样的示例,您会发现KeyboardInterrupt 仅在大约50% 的时间内被捕获。如果你在try 里面time.sleep(1),你会发现它几乎每次都会被抓到。 这会在第一个异常后停止执行。我只想完全忽略所有异常,例如print('this'); 1/0; print('this too');?假设我有 10 个命令,不想写 10 个 try 除了 pass 块。【参考方案2】:

通用答案

Python 中的标准“nop”是pass 语句:

try:
    do_something()
except Exception:
    pass

使用except Exception 而不是纯except 避免捕获SystemExitKeyboardInterrupt 等异常。

Python 2

由于在 Python 2 中会记住最后抛出的异常,因此抛出异常语句中涉及的一些对象会无限期地保持活动状态(实际上,直到下一个异常)。如果这对您很重要并且(通常)您不需要记住最后抛出的异常,您可能需要执行以下操作而不是 pass

try:
    do_something()
except Exception:
    sys.exc_clear()

这会清除最后抛出的异常。

Python 3

在 Python 3 中,保存异常实例的变量会在退出 except 块时被删除。即使变量之前保存了一个值,在进入和退出except 块后,它又会变为undefined

【讨论】:

这是一个比被接受的更好的答案,因为它使用“except Exception:”而不是“except:”,正如其他人所指出的那样,它会不正确地吞下其他你不知道的东西想要像 SystemExit 和 KeyboardInterrupt 一样捕捉。 +1 它还清除了在运行单元测试和预期异常时很重要的错误 请注意,exc_clear 已在 python 3 中删除。docs.python.org/3/whatsnew/3.0.html#index-22。有关在 Python 3 中解决此问题的一些方法,请参见此处:cosmicpercolator.com/2016/01/13/… 见***.com/a/53575187/3140992 快速忽略多个异常 也可以在except 子句中使用...(省略号)代替passexcept Exception: ...【参考方案3】:

在 Python 3.4 中提供了一种新方法:

from contextlib import suppress

with suppress(Exception):
  # your code

这是添加它的提交:http://hg.python.org/cpython/rev/406b47c64480

这里是作者 Raymond Hettinger,谈论这个以及其他各种 Python 热点(相关位在 43:30):http://www.youtube.com/watch?v=OSGv2VnC0go

如果您想模拟简单的 except 关键字并忽略 KeyboardInterrupt 之类的内容(尽管您通常不这样做),您可以使用 with suppress(BaseException)

编辑:在 3.4 版本之前,ignored 似乎已重命名为 suppress

【讨论】:

我不确定我是否喜欢这个解决方案...我想我们的想法是我们已经用 1 行替换了 3 行(try、except 和 pass 都合并为一个。)我反对的主要事情是它如何引入一个新关键字,似乎证明了你可能不应该做的事情......看起来你应该总是至少记录你正在捕获的异常...... 当引发异常时,它会在 try/catch 或 with 块之外的任何内容之后继续执行代码吗? 这相当于将你的代码包装在try...catch: pass中,所以如果在块内引发异常,将在块结束后继续执行。 @ArtOfWarfare 如果我说,我会给你一个整数,但有时我会在一个单例元组中给你,我不会告诉你什么时候做一个或其他;现在你的工作是总是把整数还给我?也许你会喜欢写with suppress(TypeError): return data[0]之类的东西(更长的例子:pastebin.com/gcvAGqEP) 仅供参考,django 在 2017-09 恢复使用 with suppress(Exception),因为 try/except 表现更好。检查此提交Reverted "Fixed #27818 -- Replaced try/except/pass with contextlib.su…【参考方案4】:

试试这个:

try:
    blah()
except:
    pass

【讨论】:

以上是关于python 如何跳过异常继续执行的主要内容,如果未能解决你的问题,请参考以下文章

Python 忽略warning警告错误 + 跳过报错继续执行程序

java try语句中跳过异常继续执行tyr中接下来的语句

python怎么在异常处理后继续顺序执行?

如何跳过在批处理文件中发现的错误并继续执行命令行?

如何跳过嵌套块中的异常

2019-12-2 异常捕获