Бросать исключения в нужное время - PullRequest
0 голосов
/ 18 мая 2011

Только что наткнулся на довольно запутанный экзаменационный вопрос, и мой лектор уезжает на каникулы, поэтому я прихожу в StackOverflow, прося помощи!

Вопрос в следующем:

"У Джо есть свой собственный класс JoeConnection для создания соединений между его компьютером и другими компьютерами. Класс предоставляет следующие методы конструктора и экземпляра:

JoeConnection( String address ): Make a connection with the URL address.
void writeLn( String text ) : Write text to the JoeConnection.
String readLn( ): Read a line of text from the JoeConnection.
void clode( ) : Close the JoeConnection.

Соединения Джо регулярно терпят неудачу, и это вызывает ошибки. Используя правильную обработку исключений, продемонстрируйте, как использовать класс Joe's JoeConnection для

  1. создать JoeConnection с URL http://students.chat.box
  2. написать "Привет, мир" JoeConnection
  3. читать в строке из JoeConnection
  4. закрыть соединение.

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

Я не знаю, как с этим справиться, но я предполагаю, что это что-то похожее на это:

public class Test {
    try { 
        JoeConnection connection = new JoeConnection(http://students.chat.box); 
    } catch {
        connectionError e; printStacktrace();}
    }
}

Может кто-нибудь помочь мне разобраться? Большое спасибо.

Ответы [ 5 ]

3 голосов
/ 18 мая 2011

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

Но дальнейшие инструкции в вашем назначении вводят другое понятие «правильно».Вы должны напечатать трассировку стека.Так что поймайте исключение и напечатайте трассировку стека.Вы были на правильном пути, но ваш синтаксис был неправильным.Вернитесь к своему учебнику и заметкам к лекциям, чтобы напомнить себе, каков синтаксис для перехвата исключений (и для передачи строк в функции).

try {
  JoeConnection connection = new JoeConnection("http://students.chat.box");
  connection.writeLn("Hello world");
  // etc
} catch (Exception e) {
  e.printStackTrace();
}
1 голос
/ 18 мая 2011

«Правильная обработка исключений» немного расплывчата. Я согласен с утверждением @Rob Kennedy о том, что обработка исключений не подходит, если вы не знаете, почему возникло исключение и что с ним делать. В противном случае следует разрешить распространение исключения. Так, например:

void foo(String address) throws JoeException {
    JoeConnection connection = new JoeConnection(address);
    try {
        connection.writeLn("Hello World!");
    } finally {
        // Ensure the connection is closed when finished.
        // This happens whether an exception occurs or not.
        connection.close();
    }
}

Если вы хотите перехватить исключение только для его печати, вы можете сделать что-то вроде этого:

void foo(String address) throws JoeException {
    try {
        JoeConnection connection = new JoeConnection(address);
        try {
            connection.writeLn("Hello World!");
        } finally {
            connection.close();
        }
    } catch (JoeException e) {
        e.printStackTrace();
        // Don't know what to do about this; rethrow.
        throw e;
    }
}

Здесь есть тонкость, которую даже опытные программисты на Java могут упустить. Если при создании соединения возникает исключение, его не нужно закрывать. Если во время записи в соединение возникает исключение, оно требует закрытия ; таким образом, пункт finally. Тем не менее, акт закрытия также может вызвать исключение. Если закрытие соединения вызывает исключение, только это исключение будет выдано оператором try . Если предложение finally было получено в результате операции writeLn, вызвавшей исключение, исключение из вызова writeLn будет фактически проигнорировано. Это, вероятно, не то, что вы хотите.

Вместо этого мы можем попробовать что-то уродливое, как это:

void foo(String address) throws JoeException {
    try {
        JoeConnection connection = new JoeConnection(address);
        boolean normalCompletion = false;
        try {
            connection.writeLn("Hello World!");
            normalCompletion = true;
        } finally {
            if (normalCompletion) {
                // The writeLn operation completed normally.
                // Propagate an exception thrown by the close operation.
                connection.close();
            } else {
                // The writeLn operation completed abruptly.
                // Ignore an exception thrown by the close operation.
                try {
                    connection.close();
                } catch (JoeException e) {
                    /* empty */
                }
            }
        }
    } catch (JoeException e) {
        e.printStackTrace();
        // Don't know what to do about this; rethrow.
        throw e;
    }
}

Это выглядит (и является) синтаксически отвратительным, но показывает "правильную" обработку исключений для сортировки. Улучшение языка из Project Coin должно немного исправить это.

0 голосов
/ 18 мая 2011

Перехват исключения должен выглядеть следующим образом:

try {
    JoeConnection conn = new JoeConnection(url);
} catch (YourExceptionClassNameHere e) {
    e.printStackTrace();
}

Также: если вы хотите использовать буквальную строку, убедитесь, что вы включили в нее цитаты. (Должно быть "http://students.chat.box".)

0 голосов
/ 18 мая 2011

Хорошо также иметь finally:

public class Test {

    try { 
        JoeConnection connection = new JoeConnection(http://students.chat.box); 
    } 

    catch(Exception e) {
        e.printStacktrace();
    }

    finally {
       if(connection != null) {
          connection.close();
       }
    }
}

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

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

public class Test {

    JoeConnection connection = null;

    try {
       connection = new JoeConnection("http://students.chat.box");  
       ...
       ...           
    } 

    catch(OpenException e) {
       System.out.println("Error while opening connection");
       e.printStacktrace();
    }    

    catch(WriteException e) {
       System.out.println("Error while writing to connection");
       e.printStacktrace();
    }

    catch(ReadException e) {
       System.out.println("Error while reading from connection");
       e.printStacktrace();
    }

    finally {
       if(connection != null) {
          connection.close();
       }
    }
}
0 голосов
/ 18 мая 2011

Для начала, я могу помочь вам с синтаксисом того, что вы написали:

try {
    JoeConnection connection = new JoeConnection("http://students.chat.box");
}
catch (JoeConnectionException e) {
    e.printStacktrace();
}

Я позволил себе изменить разрывы строк и переименовать 'connectionError' в JoeConnectionException, что для меня выглядит более привычным.

Вы должны будете сделать нечто подобное для вызовов методов readLn, writeLn и close, поскольку в нем говорится, что соединение регулярно прерывается (т. Е. Не только во время соединения).

Ура, удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...