2010-03-18 3 views
1

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

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, он будет бросать исключение немедленно (хотя это, кажется, не очень описательный):

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

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

+0

оптимальная идея: используйте обе! –

+0

Если да, то да. Я не знаком с «кодовыми контрактами», как представлено выше. –

+0

Не было смысла использовать оба варианта. Идея иметь кодовый контракт, в котором указано, что x> = 0, заключается в том, что мне не нужно проверять его снова в теле метода. Поэтому нет смысла использовать оба. –

1

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

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

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