如何以功能方式处理Java中的异常?
如果我这样做:
try{
}
catch(Exception e)
{
//log it
// throw exception?
}
并抓住异常,我应该返回什么:
否则发送一些错误代码(类似于我们用C语言处理的方式)
因为函数式编程说:
函数应始终返回相同的类型。
鉴于这种情况,对于某些给定的输入,它将抛出异常。因此它不是一种纯粹的功能风格。
如何在Java中处理这种情况?
答案 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的挫败感