2013-12-20 4 views
2

Это очень простой вопрос, я часто использую com.google.common.base.Preconditions в своих проектах для проверки аргументов и параметров, например:Пользовательские исключения с гуавы предусловий

Preconditions.checkNotNull(parameter, "message");
Preconditions.checkArgument(parameter > 0, "message");

это код может вызывать исключение IllegalArgumentException или NPE. Но очень часто мне нужно бросить собственное исключение. Как это сделать в этой библиотеке? Или, может быть, вы можете посоветовать еще один? заблаговременно!

UPDATE: Я понимаю, что могу создать собственный простой класс утилиты, но мне интересно найти готовые решения. Пожалуйста, дайте мне знать, если кто-то знает, что это возможно.

ответ

2

Это решение, которое я, наконец, пришел в себя. Он делает именно то, что я хотел. Может быть полезно для кого:

import java.lang.reflect.InvocationTargetException; 

// IMPORTANT: parameter exClass must have at least no args constructor and constructor with String param 
public class Precondition { 

public static <T extends Exception> void checkArgument(boolean expression, Class<T> exClass) throws T { 
    checkArgument(expression, exClass, null); 
} 

public static <T extends Exception> void checkArgument(boolean expression, Class<T> exClass, String errorMessage, Object... args) throws T { 
    if (!expression) { 
     generateException(exClass, errorMessage, args); 
    } 
} 

public static <T extends Exception> void checkNotNull(Object reference, Class<T> exClass) throws T { 
    checkNotNull(reference, exClass, null); 
} 

public static <T extends Exception> void checkNotNull(Object reference, Class<T> exClass, String errorMessage, Object... args) throws T { 
    if (reference == null) { 
     generateException(exClass, errorMessage, args); 
    } 
} 

private static <T extends Exception> void generateException(Class<T> exClass, String errorMessage, Object... args) throws T { 
    try { 
     if (errorMessage == null) { 
      throw exClass.newInstance(); 
     } else { 
      throw exClass.getDeclaredConstructor(String.class, Object[].class).newInstance(errorMessage, args); 
     } 
    } catch (InstantiationException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
} 

}

6

Если вы хотите бросить свое собственное исключение, просто создайте свой собственный класс схожими методами с теми, что указаны в Preconditions. Каждый из этих методов чрезвычайно прост - добавление некоторой возможности «плагина», позволяющей указать класс исключения, действительно будет чрезмерным, по сравнению с написанием собственного.

Вы всегда можете использовать source of Preconditions в качестве отправной точки.

1

Типы исключений жестко закодированы в классе Preconditions. Вам нужно будет реализовать свое собственное исключение и собственную функцию проверки. Вы всегда можете сделать это в статическом классе, аналогичном тому, как работают Preconditions.

2

Вы можете использовать valid4j с Hamcrest-matchers вместо (находится на Maven Central, как org.valid4j: valid4j)

Для проверки входных данных метательные пользовательских исключений:

import static org.valid4j.Validation.*; 

validate(argument, isValid(), otherwiseThrowing(InvalidException.class)); 

Для предварительных условий и постусловий (то есть утверждения):

import static org.valid4j.Assertive.*; 

require(argument, notNullValue()); 
... 
ensure(result, isValid()); 

Ссылки:

0

Вы всегда могли бы сделать что-то подобное для вас есть (я не знаю, почему ребята из гуавы не добавить еще):

public static void check(final boolean expression, RuntimeException exceptionToThrow) { 
    if (!expression) { 
     throw checkNotNull(exceptionToThrow); 
    } 
} 

public static void check(final boolean expression, Supplier<? extends RuntimeException> exceptionToThrowSupplier) { 
    if (!expression) { 
     throw checkNotNull(exceptionToThrowSupplier).get(); 
    } 
} 
Смежные вопросы