目录
  • 1. 起因
  • 2. python中的try/except
    • 1)情形一
    • 2)情形二
    • 3)情形三
  • 3. r中的trycatch
    • 1)情形一
    • 2)情形二
    • 3)情形三
  • 补充

    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

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

    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)情形一

    输入:

    divide(2, 1)
    

    输出:

    result is 2.0
    executing finally clause
    

    2)情形二

    输入:

    divide(2, 0)
    

    输出:

    division by zero!
    executing finally clause
    

    3)情形三

    divide("2", "1")
    

    输出:

    error!
    executing finally clause
    

    3. r中的trycatch

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

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

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

    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)情形一

    输入:

    divide(1, 2)
    

    输出:

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

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

    2)情形二

    输入:

    divide(1, 0)
    

    输出:

    [1] "executing finally clause"
    [1] inf
    

    注意,r会输出inf,这点与python不同。

    3)情形三

    输入:

    divide(1, '0')
    

    输出:

    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语言异常解决的资料请关注www.887551.com其它相关文章!