2012-06-19 2 views
1

Я хочу продлить RuntimeException, чтобы создать это конкретное исключение:Собственного сообщения исключения

class CompileLinkException extends RuntimeException { 

    CompileLinkException(int shader) { 
     int infoLogLength = glGetShader(shader, GL_INFO_LOG_LENGTH); 
     String strInfoLog = glGetShaderInfoLog(shader, infoLogLength); 

     // set exception message = strInfoLog 

     glDeleteShader(shader); 
    } 
} 

Как установить сообщение пользовательского исключения? Единственный способ, который я знаю, - позвонить

super(message) 

но эта инструкция должна быть первым утверждением в конструкторе.

+5

Пожалуйста, не помещайте код обработчика в свой класс исключений. Поместите код обработчика во внешний блок '' 'catch''', где вы поймаете это исключение. – opyate

+1

Я думаю, что вы, люди, не обращаетесь к реальной проблеме здесь. Исключение составляют только «сосуды» и не должны содержать логическую схему поиска или любую логику. Эти ответы обескуражены. Было бы абсурдно смешно видеть, что из-за этого возникает исключение, вызванное внутри конструктора другого исключения. – Alexander

+0

@opyate, вы правы, я удалю glDeleteShader. –

ответ

1

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

super(glGetShaderInfoLog(shader, glGetShader(shader, GL_INFO_LOG_LENGTH))); 
+3

В этом случае методы 'glGetShader' и' glGetShaderInfoLog' должны быть статическими. – plucury

+0

@plucury, вы правы, методы должны быть статическими. – tibtof

+0

Я думал об этом решении, но я отказался, потому что он был уродливым:> но я приму свой ответ, если это единственный вариант. –

4

Я не знаю наверняка, что код Исключение только с помощью метода getMessage() внутренне использовать сообщение, но вы можете попробовать переопределить этот метод и увидеть независимо от того, работает оно для вас:

class CompileLinkException extends RuntimeException { 
    String strInfoLog; 

    CompileLinkException(int shader) { 
     int infoLogLength = glGetShader(shader, GL_INFO_LOG_LENGTH); 
     strInfoLog = glGetShaderInfoLog(shader, infoLogLength); 
    } 

    @Override 
    public String getMessage() { 
     return strInfoLog; 
    } 
} 
+0

Это бывает так, но кажется немного хрупким ... – assylias

+0

Согласен. Решение, предоставляемое @tibtof, кажется намного лучше. Но я оставлю этот ответ ради полноты – Veger

Смежные вопросы