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

Что касается «наименее эффективной работы для db», я думаю, что следующее было бы правильным и менее логичным вводом-выводом для вашей схемы. Поймите, однако, что вы НЕ МОЖЕТЕ знать наверняка, если не посмотрите на планы объяснения (ожидаемые и фактические).

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

select alb.titreAlb as "Titre",
     (select count(*) from pays_album t2 where t2.idAlb = alb.idAlb) "Pays",
     (select count(*) from pers_album t2 where t2.idAlb = alb.idAlb) "Personnages",
     (select count(*) from juron_album t2 where t2.idAlb = alb.idAlb) "Jurons"
from album alb
where alb.titreAlb = "LES CIGARES DU PHARAON"
10
задан Jason Plank 31 October 2011 в 14:15
поделиться

8 ответов

catch (...)
{
   // Handle exceptions not covered.
}

Важные факторы:

  • Лучший подход должен поймать определенные типы исключения, с которого можно на самом деле восстановиться в противоположность всем возможным исключениям.
  • выгода (...) также поймает определенные серьезные системные исключения уровня (варьируется в зависимости от компилятора), что Вы не собираетесь быть способными восстановиться надежно с. Ловля их таким образом и затем глотание их и продолжения могли вызвать дальнейшие серьезные проблемы в Вашей программе.
  • В зависимости от Вашего контекста может быть приемлемо использовать выгоду (...), обеспечивание исключения повторно брошено. В этом случае Вы регистрируете всю полезную локальную информацию состояния и затем повторно бросаете исключение, чтобы позволить этому распространять. Однако необходимо читать на шаблоне RAII при выборе этого маршрута.
24
ответ дан 3 December 2019 в 13:22
поделиться

Вы не хотите использовать выгоду (...) (т.е. выгода с замещающим знаком), если у Вас действительно, определенно, самый доказуемый нет потребности в нем.

Причина этого состоит в том, что некоторые компиляторы (Visual C++ 6 для именования наиболее распространенного) также поворачивают ошибки как отказы сегментации и другие действительно плохие условия в исключения, что можно с удовольствием обработать выгоду использования (...). Это очень плохо, потому что Вы больше не видите катастрофических отказов.

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

Вместо этого сделайте следующее:

  • Если Вы на самом деле знаете, какое исключение (исключения) для ожидания поймайте те типы и не больше, и
  • Если Вы должны выдать исключения сами и должны поймать все исключения, Вы бросите, заставить эти исключения произойти из станд.:: исключение (как предложенный Adam Pierce) и выгода это.
14
ответ дан 3 December 2019 в 13:22
поделиться

Если ловля всех исключений - включая ОС - действительно, в чем Вы нуждаетесь, необходимо смотреть на компилятор и ОС. Например, в Windows Вы, вероятно, имеете "__, попытка" ключевое слово или компилятор переключается, чтобы заставить "попытку/выгоду" поймать исключения SEH или обоих.

4
ответ дан 3 December 2019 в 13:22
поделиться

Если Вы находитесь на окнах и должны обработать ошибки, любят, делятся на нулевое и нарушение прав доступа, можно использовать структурированного переводчика исключения. И затем в Вашем переводчике можно выдать исключение C++:

void myTranslator(unsigned code, EXCEPTION_POINTERS*)
{
    throw std::exception(<appropriate string here>);
}

_set_se_translator(myTranslator);

Отметьте, код скажет Вам, какова ошибка была. Также необходимо скомпилировать с/EHa опцией (C/C++-> Код, который Generatrion-> Включают Исключениям C/C++ = Да за Исключениями SEH).

Если это не делает контроль смысла документами для [_set_se_translator] (http://msdn.microsoft.com/en-us/library/5z4bw5h5 (По сравнению с 80) .aspx)

5
ответ дан 3 December 2019 в 13:22
поделиться

Заставьте все свои пользовательские классы исключений наследоваться станд.:: исключение, затем можно просто поймать станд.:: исключение. Вот некоторый пример кода:

class WidgetError
    : public std::exception
{
public:
    WidgetError()
    { }

    virtual ~WidgetError() throw()
    { }

    virtual const char *what() const throw()
    {
        return "You got you a widget error!";
    }
};
3
ответ дан 3 December 2019 в 13:22
поделиться

В C++ стандарт не определяет исключение деления на нуль, и реализации имеют тенденцию не бросать их.

1
ответ дан 3 December 2019 в 13:22
поделиться

Можно, конечно, использовать catch (...) { /* code here */ }, но это действительно Зависит От того, Что Вы Хотите Сделать. В C++ у Вас есть детерминированные деструкторы (ничего подобного мусор завершения), поэтому если Вы хотите вытереть, корректная вещь сделать состоит в том, чтобы использовать RAII.

Например. вместо:

void myfunc()
{
    void* h = get_handle_that_must_be_released();
    try { random_func(h); }
    catch (...) { release_object(h); throw; }
    release_object(h);

}

Сделайте что-то как:

#include<boost/shared_ptr.hpp>

void my_func()
{
    boost::shared_ptr<void> h(get_handle_that_must_be_released(), release_object);
    random_func(h.get());
}

Создайте свой собственный класс с деструктором, если Вы не используете повышение.

1
ответ дан 3 December 2019 в 13:22
поделиться

Если я вспоминаю правильно (это было некоторое время, так как я посмотрел на C++), я думаю, что следующее должно добиться цели

try
{
 // some code
}
catch(...)
{
 // catch anything
}

и быстрый Google (http://www.oreillynet.com/pub/a/network/2003/05/05/cpluspocketref.html), кажется, доказывает меня корректный.

0
ответ дан 3 December 2019 в 13:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: