LINUX.ORG.RU

Qt переводы exceptions

 ,


0

2

Всем привет!

Не подскажете, как лучше всего реализовать обработку ошибок в гуёвом приложении, чтобы их можно было переводить на другие языки и бросать как исключения.

Тут с одной стороны lupdate требует наличия QObject, с другой - QObject запрещает копирование/перемещение, которое появляется при throw. В итоге получается целый ворох разных ошибок, который постоянно меняется как при убирании QObject, так и при добавке.

class doesNotExist: public QException, public QObject
{
        Q_OBJECT
        private:
            QString f;
        public:
            doesNotExist(const QString& filename):
                f(filename)
            {}
            virtual QString what() const noexcept override
            {
                return tr("File does not exist: ")+f;
            }
};

Ещё и типы возвращаемого значения конфликтуют у what...

В общем, буду рад любой помощи.

★★

Если ты выводишь сообщение для пользователя, то это уже не исключение, а обычная логика работы. Не используй C++-исключения для этого. Исключения - _исключительно_ служебный инструмент, сообщения которого должны быть лаконичны и состоять из latin-1 символов; а работа же с исключениями в коде - максимально проста, что бы избежать «исключений в исключениях».

Deleted
()

lupdate требует наличия QObject

Нет.

Пример:

QCoreApplication::translate(
    "OutOfRangeException",
    "Failed to access data out of bound: %1 of %2.")
    .arg(idx).arg(size);

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

ненене. Я не о том, что можно перевести все что угодно, используя qt linguist. Я о том, что:

1) есть стандартная MVC

2) Model в ней в случае ошибки кидает исключение, которое является дочерним от std::exception, QException или кастомного класса исключений.

3) Хотелось бы прямо в этом эксепшене прописать что-то вроде return tr("File Does not exist"); и чтобы lupdate его подхватывал при кидании исключения.

aido ★★
() автор топика
Ответ на: комментарий от aido

Дай угадаю, ты потом ловишь это исключение в контроллере и показываешь пользователю? Да ты маньяк просто

annulen ★★★★★
()

Уж сколько раз твердили миру... Не надо сообщения хранить в исключениях, храни тип и дополнительные данные (имя файла). Форматируй при перехвате. Тебе всё равно потребуется обрабатывать там не только Qt'шные исключения.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от Deleted

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

Чушь собачья, всё с точностью наоборот. Если ты сообщаешь пользователю об ошибке, то это 100% исключительная ситуация и юзкейс для исключений. Обычная логика работы от пользователя как раз скрыта.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

А исключения вообще неудобные. Ими, по сути, вообще пользоваться нельзя, потому что копирование должно быть nothrow, а значит в них нельзя хранить ничего кроме POD.

slovazap ★★★★★
()
Ответ на: комментарий от RazrFalcon

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

eao197 ★★★★★
()
Ответ на: комментарий от aido

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

deep-purple ★★★★★
()
Ответ на: комментарий от RazrFalcon

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

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

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)

Q_OBJECT

Макрос нужен, если кидаешь из класса сигналы. Так ты только генерируешь бесполезный код.

public QObject

Зачем? Используй статический метод QObject::tr. Он вроде должен работать. Я забыл как у себя делал. У меня там были глобальные константы со строками вне класса. И всё переводилось.

QObject запрещает копирование/перемещение, которое появляется при throw.

Какое такое копирование? Ты же, я надеюсь, исключения по ссылке ловишь? catch (const doesNotExist &e)

ox55ff ★★★★★
()
Ответ на: комментарий от aido

Почему маньяк сразу?

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

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.