如何处理 lambda 中的已检查异常? [复制]

Posted

技术标签:

【中文标题】如何处理 lambda 中的已检查异常? [复制]【英文标题】:How do I deal with checked exceptions in lambda? [duplicate] 【发布时间】:2016-11-02 10:04:34 【问题描述】:

我有以下代码sn-p。

package web_xtra_klasa.utils;

import java.util.Arrays;
import java.util.Properties;
import java.util.function.Function;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Main 
    public static void main(String[] args) throws Exception 
        Transport transport = null;
        try 
            final Properties properties = new Properties();
            final Session session = Session.getDefaultInstance(properties, null);
            final MimeMessage message = new MimeMessage(session);
            final String[] bcc = Arrays.asList("user@example.com").stream().toArray(String[]::new);
            message.setRecipients(Message.RecipientType.BCC, Arrays.stream(bcc).map(InternetAddress::new).toArray(InternetAddress[]::new));
         finally 
            if (transport != null) 
                try 
                    transport.close();
                 catch (final MessagingException e) 
                    throw new RuntimeException(e);
                
            
        
    

由于以下错误,无法编译。

未处理的异常类型 AddressException

我进行了一些研究,所有解决方案都只是将检查的异常包装在自定义方法中的运行时异常中。我想避免为这些东西编写额外的代码。有没有标准的方法来处理这种情况?

编辑:

到目前为止我所做的是

message.setRecipients(Message.RecipientType.BCC,
        Arrays.stream(bcc).map(e -> 
            try 
                return new InternetAddress(e);
             catch (final AddressException exc) 
                throw new RuntimeException(e);
            
        ).toArray(InternetAddress[]::new));

但它看起来并不好。我可以发誓,在其中一个教程中,我已经看到了 rethrow 或类似的标准内容。

【问题讨论】:

***.com/search?q=checked+exceptions+in+lambda 不,所有结果都是关于编写大量附加代码来捕获并重新抛出已检查的异常作为运行时异常。 所以您认为,这些开发人员都是为了好玩而这样做,而忽略了无需额外代码即可工作的假设解决方案? 【参考方案1】:

您可能会使用一些Try<T> 容器。 有几个已经编写好的实现。例如:

https://github.com/javaslang/javaslang/blob/master/javaslang/src/main/java/javaslang/control/Try.java https://github.com/hiro0107/java8-try-monad/blob/master/src/main/java/com/github/hiro0107/trymonad/Try.java

或者你可以自己写。

【讨论】:

以上是关于如何处理 lambda 中的已检查异常? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

处理 lambda 中的已检查异常 [重复]

如何处理未经检查的异常?

从 lambda 表达式中抛出的已检查异常

Spring security 3.1如何处理不同的认证异常?

如何处理所有 DBNull 而无需每次都检查它们(使用生成的 DataSet)? [复制]

C# 中的异常处理 - 如何处理?