繁体   English   中英

使用JDK 8处理异常

[英]Handling exception with jdk 8

我在C#中使用委托处理异常:

public void QueryIpRanges(Action<ObservableCollection<LocationRange>, Exception> callback)
        {
            try
            {
                var ranges = from e in _xml.Descendants("computer")
                    select new LocationRange
                    {
                        Name = e.Attribute("prefix").Value,
                        Addresses = new ObservableCollection<IpRange>(
                            from i in e.Descendants("range")
                            select new IpRange
                            {
                                Start = i.Element("start").Value,
                                End = i.Element("end").Value,
                                Subnet = i.Element("subnet").Value,
                                Gateway = i.Element("gateway").Value
                            })
                    };

                callback(new ObservableCollection<LocationRange>(ranges), null);
            }
            catch (FormatException ex)
            {
                callback(null, ex);
            }
            catch (ArgumentNullException ex)
            {
                callback(null, ex);
            }

        }

从上面可以看到,如果发生异常,我将使用委托来传递异常。
我的问题是,如何在Java 8中使用lambda做到这一点。 在Java 8中处理异常最干净的方法是什么

您可以在Java中以类似方式执行此操作。 您将需要一个带有两个参数的功能接口,例如java.util.function.BiConsumer 然后看起来像这样:

public void queryIpRanges(BiConsumer<ObservableCollection<LocationRange>, Exception> callback) {
    try {
        // ...

        callback.accept(new ObservableCollection<LocationRange>(ranges), null);
    }
    catch (FormatException ex) {
        callback.accept(null, ex);
    }
    catch (ArgumentNullException ex) {
        callback.accept(null, ex);
    }
}

做这样的事情:

public class Program {
    public static void main(String[] args) {
        final int[] myInt = new int[1];
        tryParseInt("123", (rs, ex) -> {
            if (ex == null) {
                myInt[0] = rs;
            } else {
                ex.printStackTrace();
                System.exit(1);
            }
        });
        System.out.println("myInt = " + myInt[0]);
    }

    static void tryParseInt(String text, Callback<Integer, NumberFormatException> callback) {
        try {
            callback.publish(Integer.parseInt(text), null);
        } catch (NumberFormatException ex) {
            callback.publish(null, ex);
        }
    }
}

@FunctionalInterface
interface Callback<T, E extends Exception> {
    void publish(T result, E ex);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM