如何以函数方式处理Java中的异常

时间:2014-12-20 14:25:52

标签: java functional-programming

如何以功能方式处理Java中的异常?

如果我这样做:

try{
}
catch(Exception e)
{
   //log it
   // throw exception? 
}

并抓住异常,我应该返回什么:

  1. 抛出异常?
  2. 否则发送一些错误代码(类似于我们用C语言处理的方式)

    因为函数式编程说:

  3.   

    函数应始终返回相同的类型。

    鉴于这种情况,对于某些给定的输入,它将抛出异常。因此它不是一种纯粹的功能风格。

    如何在Java中处理这种情况?

2 个答案:

答案 0 :(得分:1)

即使在函数式编程中,异常也不被视为返回值。

以这段SML代码为例:

fun remove_card (cs, c, e) =
    case cs of
    [] => raise e (* raise exception and stop execution of the function *) 
     | x::xs => if x = c 
           then xs 
           else  x::remove_card (xs,c,e)

如您所见,当引发异常时,我们忘记了函数的原始返回类型(列表)。正是在这个时刻,您的应用程序中发生了错误情况,并且您希望处理它以避免应用程序崩溃。因此,您不会破坏函数式编程的纯度,因为抛出异常,而不是返回异常,以便处理应用程序中意外值/行为导致的不稳定。

答案 1 :(得分:-1)

如果您想要放下一些信息并重新抛出然后包装异常,请不要同时记录和重新抛出。仅在完成处理此异常并计划从方法返回值时记录。不是像C中那样的错误指示,实际值。例如,您尝试下载但失败的内容,但您仍然有后备。如果您试图指出错误,则会抛出异常。

只是添加,很多时候人们通过登录并返回null来处理异常。在绝大多数情况下,这是错误的做法,因为它只会导致在完全不同的地方处理NPE的挫败感