脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python中的try except与R语言中的tryCatch异常解决

python中的try except与R语言中的tryCatch异常解决

2022-02-25 13:25Kanny广小隶 Python

这篇文章主要为大家介绍了python中的try except与R语言中的tryCatch异常解决的方式及分析,有需要的朋友可以借鉴参考下,希望能够有所帮助

1. 起因

当我们需要写一个非常非常长的循环时,通常在某个循环如果出现error,那么整个代码后面的循环就不能进行。

这时候试想,如果你在服务器上挂一个要跑很久的循环(并行),亦或是需要在自己电脑上挂一晚上跑东西,可能刚点完运行,美滋滋地上床后,程序突然出现问题。这时第二天满怀期待地点亮屏幕,发现是一个大大的红红的ERROR时,估计头发或许又会稀疏了不少。

于是这时候就会想,能不能在跑的时候,如果程序出现错误,那么我们直接绕开这些问题,进行下一次循环。

其实这种问题在PythonR中,都有相应的解决方法。

2. Python中的try/except

首先贴上官方说明文档:

英文文档:https://docs.python.org/3/tutorial/errors.html

中文文档:https://docspy3zh.readthedocs.io/en/lates t/tutorial/errors.html

这里我们仿造文档中间的例子进行构造自己的例子,具体如下述代码所示。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def divide(x, y):
    try:
        result = x / y
        
    except ZeroDivisionError:
        print("division by zero!")
    
    except:
        print('unknown error!')
    
    else:
        print("result is", result)
        
    finally:
        print("executing finally clause")

这里解释一下程序逻辑:首先运行try,如果:

不报错,就会跳到else,最后到final

分母为0的错误,会跳到except ZeroDivisionError,然后直接忽略else到最后的finally

其他类型的错误,会忽略except ZeroDivisionError,然后到except,接着再忽略else到最后的finally

也就是说无论如何,finally都是会运行的。

下面我们验证三种输入:

1)情形一

输入:

?
1
divide(2, 1)

输出:

?
1
2
result is 2.0
executing finally clause

2)情形二

输入:

?
1
divide(2, 0)

输出:

?
1
2
division by zero!
executing finally clause

3)情形三

?
1
divide("2", "1")

输出:

?
1
2
error!
executing finally clause

3. R中的tryCatch

同样的,在R中的tryCatch函数也是同样解决类似的问题。

可参考官方说明文档:trycatch: Evaluates an expression with the possibility to catch exceptions (DEPRECATED)

然后运行上面类似的程序,来看看用法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
divide <- function(x, y) {
  result <- tryCatch({
    x / y
  }, warning = function(war) {
    cat("warning!", war, "\n")
  }, error = function(err) {
    cat("error!", err, "\n")
  }, finally = {
    print("executing finally clause")
  })
  
  return(result)
}

这里需要格外注意的是,tryCatch后面是要加上小括号和大括号的。另外我加上了err这个对象,相当于会输出报错信息。

下面为运行结果:

1)情形一

输入:

?
1
divide(1, 2)

输出:

?
1
2
[1] "executing finally clause"
[1] 0.5

我是先finally,再return,所以会是上述的输出结果。

2)情形二

输入:

?
1
divide(1, 0)

输出:

?
1
2
[1] "executing finally clause"
[1] Inf

注意,R会输出Inf,这点与Python不同。

3)情形三

输入:

?
1
divide(1, '0')

输出:

?
1
2
3
4
error!
 Error in cat("error!", err, "\n") :
  argument 2 (type 'list') cannot be handled by 'cat'
[1] "executing finally clause"

补充

最后如果我们如果想要在R中忽略一些可能报错的代码时(不需要输出任何报错信息),直接使用try()即可。

以上就是python中的try except与R语言中的tryCatch异常解决的详细内容,更多关于python与R语言异常解决的资料请关注服务器之家其它相关文章!

原文链接:https://kanny.blog.csdn.net/article/details/84667843

延伸 · 阅读

精彩推荐