У меня есть код для сортировки вектора объектов. Если какой-либо из объектов недействителен, я хочу немедленно прекратить сортировку и сообщить об ошибке. В ошибке я хочу включить описание недопустимого объекта (независимо от того, какой из них существует).Почему выбрасывается исключение, считающееся плохим дизайном?
Это мой код (не полный, но я надеюсь, что вы можете следовать за мной):
int sortProc(const Bulk & b1, const Bulk & b2) {
if (!b1.isValid()) throw b1;
if (!b2.isValid()) throw b2;
return b1.compareTo(b2);
}
vector<Bulk> * items = getItems();
try {
sort(items->begin(), items->end(), sortProc);
} catch (const Bulk & item) {
cout << "Cannot sort item: " << item.description();
}
Теперь я немного неуверенный моего кода, потому что я слышал, что все исключения должны наследоваться класс исключения, и считается ошибочной практикой бросать объекты, которые не являются исключениями, но я действительно не понимаю, почему. Мой код выше работает, что-то не так с ним? Это серьезный вопрос, поэтому, если вы увидите какие-то проблемы, я был бы рад узнать. Я не ищу моральных проблем.
Проблема в том, как бы [другие] уловить ее? Особенно, если они связаны с статической библиотекой, а 'class Bulk' не определяется в каких-либо файлах заголовков. –
Учтите, что то, что вы называете «моральными проблемами», существует по какой-то причине. –
Важное значение имеет кодирование моральных проблем. Смотрите и наслаждайтесь: http://thecodelesscode.com/case/1 –