2013-03-14 2 views
-6

Я искал http://en.cppreference.com/w/cpp/error/exception & http://en.cppreference.com/w/cpp/io/basic_fstream ищет исключения I/O, которые я мог бы выбросить. Я знаю, что могу создать собственный класс исключений, и есть много веб-сайтов, предлагающих примерный код, но я хотел бы получить некоторые рекомендации в отношении лучших практик.C++ std :: exception ... возможно, мне больше нравится?

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

+7

Может быть, вы можете объяснить, что это Java, как утилита делает для тех из нас, кто не знаком с ним? – juanchopanza

+2

Не знаком с Java, я не совсем понимаю этот вопрос. Что должно делать исключение, за исключением того, что вы выходите из основного потока? Различные типы исключений дают вам возможность выбирать, какие из них вы поймаете и какие из них распространяются, но для этого вам не нужны мелкозернистые классы. –

+0

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

ответ

5

C++ 11 вводит новый заголовок system_error ошибок низкого уровня. Вы можете написать свои собственные категории ошибок.

Это может быть хорошей отправной точкой для написания вашей собственной обработки ошибок в современном C++.

+0

Мне это нравится, и мы рассмотрим его для создания настраиваемого класса исключений. – user633658

+1

+1 для того, чтобы быть единственным ответом на упоминание 'system_error', который является правильным решением в этом случае IMO. – ildjarn

+0

@ildjarn Это был ответ, потому что он представляет решение C++ 11, и мне нравится делать что-то новое. Если я получу больше рекомендаций, я с радостью переключу обозначение на этот ответ. – user633658

4

Существует много predefined exceptions, но в целом вы либо определяете свои собственные, либо бросаете std::runtime_error в первом приближении.

Как правило, вы продлеваете std::runtime_error или другие производные от std::exception, что более подходит.

Например,

class io_error : public std::runtime_error { 
public: 
    using std::runtime_error::runtime_error; 
}; 
+0

Хорошая идея, мне это нравится. Я не согласен с тем, что библиотека исключений содержит «alot», потому что я вижу, что некоторые исключения отсутствуют, и те, которые присутствуют, могут быть просто пересмотрены, поскольку некоторые из них кажутся ненужными. – user633658

+0

@ user633658 Какие из них не нужны? Я думаю, что они все используются в библиотеке 'std' где-то. –

+0

Например, логическая ошибка, которая, как представляется, не так полезна. Как я уже писал, Java прекрасна, когда дело доходит до исключений. Может быть, потому, что они просто улучшили хорошую идею о том, что C++ начал, и я думаю, что C++ мог последовать его примеру с некоторой переделкой. – user633658

4

Чтобы ответить на вопросы в библиотеке, напишите a look по адресу boost::exception.

Исключения для увеличения могут перемещаться из потока в нить, и вы можете динамически присоединять информацию к исключению - с operator<< - как вы поймаете (и, возможно, повторно запустите) его. Кроме того, макрос BOOST_THROW_EXCEPTION записывает имя файла, строки и функции в ваше выражение для печати.

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

Как более общее примечание, один из принципов дизайна C++ заключается в том, чтобы делать то, что вы просите, и ничего более, что в некоторых случаях является благословением, а в некоторых случаях означает большую работу - и сильно отличается от java. Основной целью исключений является прерывание нормального потока программы с throw/catch, и C++ делает именно это.

Если вы просто хотите простой строковый сообщение:

struct E: std::exception { 
    const char* msg; 
    E(const char* msg_): msg(msg_) {} 
    const char* what() const { return msg; } 
}; 
// ... 
throw E("invalid operation name"); 
+0

На Java ссылались из-за их хорошо организованной библиотеки исключений. Согласился, что C++ обрабатывает исключения, но их библиотека исключений сильно отсутствует, и я действительно не хочу писать собственный класс для обработки исключений. – user633658

+3

@user Ни ваш вопрос, ни ваш комментарий не объясняют, каким образом вы считаете исключения C++ неполными. – us2012

+5

В зависимости от точки зрения: C++ имеет менее полную библиотеку, чем java, или она не заставляет вас создавать свой дизайн библиотеки. Это факт, и это, возможно, особенность. Используйте boost :: exception или другие библиотеки, если хотите. Кроме того, при написании простого класса исключений со строкой ошибки будет меньше символов, чем этот комментарий. – Antoine