java - अमर - जाम के पत्ते के फायदे



अमरूद कैश और चेक अपवादों को संरक्षित किया गया (1)

प्रश्न लिखने के बाद जेनेरिक के साथ संचालित उपयोगिता विधि के बारे में सोचना शुरू किया फिर थ्रोबॉबल्स के बारे में कुछ याद आया । और हाँ, यह पहले से ही है! )

अनचेकएक्सेक्यूशन अपवाद या निष्पादन त्रुटि को भी संभालना आवश्यक हो सकता है।

तो समाधान है:

public Post getPost(final Integer key) throws SQLException, IOException {
    try {
        return cache.get(key, new Callable<Post>() {
            @Override
            public Post call() throws Exception {
                return PostsDB.findPostByID(key);
            }
        });
    } catch (ExecutionException e) {
        Throwables.propagateIfPossible(
            e.getCause(), SQLException.class, IOException.class);
        throw new IllegalStateException(e);
    } catch (UncheckedExecutionException e) {
        Throwables.throwIfUnchecked(e.getCause());
        throw new IllegalStateException(e);
    }
}

बहुत अच्छा!

भी देखें ThrowablesExplained

मैं अमरूद कैश का उपयोग करने के लिए कुछ कोड का पुनर्रचना कर रहा हूं।

आरंभिक कोड:

public Post getPost(Integer key) throws SQLException, IOException {
    return PostsDB.findPostByID(key);
}

कुछ को तोड़ने के क्रम में मुझे किसी भी फेंक दिया अपवाद को संरक्षित करने की आवश्यकता है, जैसे कि इसे लपेटने के बिना।

वर्तमान समाधान कुछ हद तक बदसूरत दिखाई देता है:

public Post getPost(final Integer key) throws SQLException, IOException {
    try {
        return cache.get(key, new Callable<Post>() {
            @Override
            public Post call() throws Exception {
                return PostsDB.findPostByID(key);
            }
        });
    } catch (ExecutionException e) {
        Throwable cause = e.getCause();
        if (cause instanceof SQLException) {
            throw (SQLException) cause;
        } else if (cause instanceof IOException) {
            throw (IOException) cause;
        } else if (cause instanceof RuntimeException) {
            throw (RuntimeException) cause;
        } else if (cause instanceof Error) {
            throw (Error) cause;
        } else {
            throw new IllegalStateException(e);
        }
    }
}

क्या यह अच्छा बनाने के लिए कोई संभव तरीका है?





checked-exceptions