Должен ли я использовать Try / Catch? - PullRequest
0 голосов
/ 14 октября 2019

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

Мне интересно, каков наилучший способ обработки out of bounds exceptions длятакая проблемаДолжен ли я использовать try-catch блоки для каждого проверяемого индекса? Часть catch не использовалась бы в этом случае, так как я не хотел бы ничего печатать или завершать программу в случае ошибки. Вот почему я думаю, что может быть лучший способ справиться с этим.

Это некоторый упрощенный код для "проверки индекса"

private static void findRoute(String[][] area, int currentRow, int currentCol) {
    int row = currentRow;
    int col = currentCol;

    while(!area[row][col].equals("D")) {
        try {
            checkRight(area, row, col);
        } catch(IndexOutOfBoundsException io) {
            //Move on
        }


        try {
            checkLeft(area, row, col);
        } catch(IndexOutOfBoundsException io) {
            //Move on
        }
    }
}

Так, например, если первый try-catch block приводит к ошибке, я бы хотел, чтобы она переместилась на следующую try-catch для проверки следующего значения.

Однако, если ошибки нет, я хочу проверить значение по индексу, который былиспользуя блок try-catch. Но если я добавлю оператор после try-catch, чтобы получить значение checkRight(), и ошибка в try-catch будет выдана, то это просто выдаст мне ошибку, и программа вылетит.

Должен ли я обращаться с этим по-другому? Есть ли более простой способ справиться с этим с помощью if-statements или чем-то еще?

1 Ответ

0 голосов
/ 14 октября 2019

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

Основная ошибка, которую вы делаете вОрганизация вашего кода заключается в том, что ваша забота об ограничениях индекса обрабатывается на уровне findRoute, а не на должном уровне, то есть в ваших checkLeft и checkRight методах. На уровне findRoute вы ожидаете получить некоторые крайние случаи (в буквальном смысле), но на уровне checkLeft и checkRight вам необходимо справиться с этим. В результате вы должны перенести все свои опасения по поводу границ в checkLeft и checkRight. Если вы видите значение в обработке вне границ как исключение для ведения журнала или для любой другой цели, то вы можете попробовать выполнить попытку на уровне этих методов, но вы должны убедиться, что они обрабатывают это. Например, вы можете изменить эти методы на boolean и возвращать true в конце try и false в конце catch, like

try {
    //Do some stuff
    return true;
} catch (Exception e) {
    //Do some stuff
    return false;
}

и тогда вы можете сделать что-то вроде этого:

checkRight (area, row, col) ||checkLeft (area, row, col);

Не беспокойтесь: если checkRight равно true, checkLeft не будет вызвано.

...