Контракты против исключений - PullRequest
1 голос
/ 18 марта 2010

Предположим, у меня есть следующий код:

public class MainClass {
    public static void main(String[] args) {
        System.out.println(sumNumbers(10, 10));
    }

    //@requires a >= 10;
    //@ensures \result < 0;
    public static int sumNumbers(int a, int b) {
        return a+b;
    }
}

Я могу сделать 2 вещи здесь:

Используйте кодовые контракты (в данном случае, что в комментариях). Когда sumNumbers запущен и <10, он немедленно выдаст исключение (хотя это не очень описательно): </p>

Exception in thread "main" org.jmlspecs.jmlrac.runtime.JMLInternalNormalPostconditionError: by method MainClass.sumNumbers
    at MainClass.sumNumbers(MainClass.java:500)
    at MainClass.internal$main(MainClass.java:9)
    at MainClass.main(MainClass.java:286)

или ...

Брось исключение. Исключение может быть настолько описательным, насколько я хочу. Я бы также проверил в конце функции, чтобы увидеть, когда условия публикации выполняются или нет.

Что бы вы использовали здесь и почему?

Ответы [ 2 ]

2 голосов
/ 18 марта 2010

Мне нравится идея кодовых контрактов, но описательная IllegalArgumentException (или аналогичная) подсказывает мне это. В роли поддержки / производства (или даже разработки) гораздо яснее получить явное сообщение об исключении, которое дает вам преимущество в диагностике того, что идет не так (не работает ли система или вы неправильно используете API во время разработки). ).

1 голос
/ 18 марта 2010

Ожидаете ли вы, что неверные входные данные могут быть переданы этому аргументу во время нормальной работы вашей программы? Если они есть, вы можете оправиться от этого?

Если это так, проверенные исключения - это путь.

Если вы не можете прийти в себя после такого случая, то непременно заключите договор и громко провалитесь, но в любом случае я бы использовал описательное сообщение об ошибке.

...