当前位置: 首页 > 面试题库 >

一旦进入finally块,如何确定是否引发了异常?

温翔宇
2023-03-14
问题内容

一旦进入该finally子句,是否可以判断是否存在异常?就像是:

try:
    funky code
finally:
    if ???:
        print('the funky code raised')

我正在寻找使这种东西更干的方法:

try:
    funky code
except HandleThis:
    # handle it
    raised = True
except DontHandleThis:
    raised = True
    raise
else:
    raised = False
finally:
    logger.info('funky code raised %s', raised)

我不喜欢它需要捕获一个您不打算处理的异常,而只是设置一个标志。

由于某些注释要求在MCVE中使用较少的“
M”,因此这里有一些用例的背景知识。实际的问题与日志记录级别的升级有关。

  • 时髦的代码是第三方,不能更改。
  • 故障异常和堆栈跟踪不包含任何有用的诊断信息,因此logger.exception在except块中使用这里无济于事。
  • 如果出现了时髦的代码,那么我需要查看的一些信息已经记录在DEBUG级别。我们不能也不能够处理该错误,但是由于需要的信息已经存在,因此我们希望升级DEBUG日志记录。
  • 大多数情况下,时髦的代码不会提高。在一般情况下,我不想升级日志记录级别,因为它太冗长了。

因此,代码在日志捕获上下文下运行(该日志捕获上下文设置了自定义处理程序以拦截日志记录),并且一些调试信息会追溯重新记录:

try:
    with LogCapture() as log:
        funky_code()  # <-- third party badness
finally:
    # log events are buffered in memory. if there was an exception,
    # emit everything that was captured at a WARNING level
    for record in log.captured:
        if <there was an exception>:
            log_fn = mylogger.warning
        else:
            log_fn = getattr(mylogger, record.levelname.lower())
        log_fn(record.msg, record.args)

问题答案:

raised = True
try:
funky code
raised = False
except HandleThis:
# handle it
finally:
logger.info(‘funky code raised %s’, raised)

考虑到添加有关选择日志级别的问题的其他背景信息,这似乎很容易适应预期的用例:

mylog = WARNING
try:
    funky code
    mylog = DEBUG
except HandleThis:
    # handle it
finally:
    mylog(...)


 类似资料:
  • 问题内容: 在Java中,是否有一种优雅的方法可以在运行finally块之前检测是否发生了异常?在处理“ close()”语句时,通常需要在finally块中进行异常处理。理想情况下,我们希望维护两个异常并向上传播它们(因为它们都可能包含有用的信息)。我能想到的唯一方法是在try- catch-finally范围之外有一个变量,以保存对引发的异常的引用。然后将“保存的”异常与在finally块中发

  • 问题内容: 有没有一种优雅的方法来处理块中引发的异常? 例如: 如何避免在/ 在块? 问题答案: 我通常这样做: 别处:

  • 问题内容: 通常,我会遇到必须吞下/ 块中清理代码所引发的异常以防止原始异常被吞咽的情况。 例如: 假设记录任何异常不是方法块范围内的选项,而是由调用and 方法的代码完成。 吞没和方法抛出的异常是一个好主意吗?如果没有,什么是处理上述情况的更好方法,以免吞下异常? 问题答案: 我不喜欢捕捉和抛出异常。 如果你抓住它,做 一些 与它-即使它只是记录例外。 如果您不能执行任何操作,请不要捕获它-在方

  • 问题内容: 有谁知道是否存在可以测试被测代码中是否抛出异常的或类似东西? 问题答案:

  • 所以,场景是我正在做一些数据库操作,最后提交/回滚,然后连接关闭。但是连接关闭也会抛出SQLException。 在这种情况下,最好的方法是什么? 捕获并记录它。 捕获并抛出异常,以便调用函数可以处理它 在#1的情况下,调用函数永远不会知道出了问题。

  • 问题内容: 当前,我在显示从我的Web服务Node.js服务器(localhost:3000)发送到运行在Node.js服务器(localhost:3001)上的模拟客户端的响应的“块”时遇到问题。 编辑*-当前实现仅使用Angular的%http作为没有网络套接字的传输方式 逻辑如下: 1。在“城市”的客户端上创建一个数组,并将其发布(从AngularJS控制器中)到位于以下位置的Web服务:l

  • 问题内容: 考虑到此代码,我是否可以绝对确定该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果您调用 System.exit() 如果您调用 Runtime.getRuntime().halt(exitStatus) 如果JVM首先崩溃 如果JVM在try或catch块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM

  • 问题内容: Java程序如何找出它是否在调试模式下运行? 在常规的“全速”模式下,应用程序的行为应与“调试模式”下(在连接调试器时,在调试模式下运行)的行为有所不同。该应用程序通过TCP与另一台计算机,另一进程或自身内部进行通信。我的同事希望我们默认使用,以便从套接字读取最多可以阻塞1秒钟。调试时,这当然是不够的,并且应用程序将停止正常运行。因此,一种解决方案是设置较高的值,但仅在调试模式下使用(