почему действительно бросает, “ничто” не вызывает завершение программы?

Попробуйте следующее: -

SET @start_res = 20150301;
SET @finish_res= 20150501;
SET @finish_check= 20150801;
SET @start_check= 20150301;
SET @daily_hos= 3;

SELECT 

(SELECT COUNT(DAY_IN) AS arr FROM t_hospital WHERE 
DAY_IN between  @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res and 
ID_daily_hos =@daily_hos) e,

(SELECT COUNT(PAT_STATUS) AS ONG1 FROM t_hospital WHERE 
PAT_STATUS  like '%ong%' and  
DAY_IN between @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) a,

(SELECT COUNT(PAT_STATUS) AS RTED FROM t_hospital WHERE 
PAT_STATUS  like '%rtde%' and  
DAY_IN between  @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos)b,

(SELECT COUNT(PAT_STATUS) AS POLI FROM t_hospital WHERE 
PAT_STATUS  like '%pol%' and 
DAY_IN between @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) c,

(SELECT COUNT(PAT_STATUS) AS para FROM t_hospital WHERE 
PAT_STATUS  like '%para%' and  
DAY_IN between @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) d

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

14
задан aJ. 16 March 2009 в 16:29
поделиться

7 ответов

Это - ожидаемое поведение. Из стандарта C++:

, Если никакое исключение в настоящее время не обрабатывается, выполняя выражение отсеивания без оконечных вызовов операнда () (15.5.1).

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

28
ответ дан 1 December 2019 в 06:21
поделиться

Уточнить ответ Neil:

throw; отдельно попытается повторно повысить текущее исключение быть, раскручиваются - если несколько раскручиваются, это пытается повторно бросить новое. Если ни один не раскручивается, то завершается (), назван, чтобы сигнализировать, что Ваша программа сделала что-то поддельное.

Относительно Вашего следующего вопроса, почему компилятор не предупреждает с throw; вне блока выгоды, то, что компилятор не может сказать во время компиляции ли throw; строка может выполняться в контексте блока выгоды. Рассмотрите:

// you can try executing this code on [http://codepad.org/pZv9VgiX][1]
#include <iostream>
using namespace std;

void f() {
    throw 1;
}
void g() {
    // will look at int and char exceptions
    try { 
        throw;
    } catch (int xyz){
        cout << "caught int " << xyz << "\n";
    } catch (char xyz){
        cout << "caught char " << xyz << "\n";
    }
}
void h() {
    try {
        f();
    } catch (...) {
        // use g as a common exception filter
        g();
    }
}
int main(){
    try {
        h();
    } catch (...) {
        cout << "some other exception.\n";
    }
}

В этой программе, g() действует в качестве фильтра исключения и может использоваться от h() и любая другая функция, которая могла использовать это поведение обработки исключений. Можно даже вообразить более сложные случаи:

void attempt_recovery() {
    try{
        // do stuff
        return;

    } catch (...) {}

    // throw original exception cause
    throw;
}
void do_something() {
    for(;;) {
        try {
            // do stuff
        } catch (...) {
            attempt_recovery();
        }
    }
}

Здесь, если исключение произойдет в do_something, то код восстановления будет вызван. Если тот код восстановления успешно выполняется, об исходном исключении забывают, и задача повторно предпринята. Если код восстановления перестал работать, тот отказ проигнорирован, и предыдущий отказ является переброском. Это работает потому что throw; в attempt_recovery вызывается в контексте do_somethingблок выгоды.

12
ответ дан 1 December 2019 в 06:21
поделиться

Из стандарта C++:

15.1 Выдача исключения

...

Если никакое исключение в настоящее время не обрабатывается, выполняя исключение броска без вызовов операнда terminate()

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

10
ответ дан 1 December 2019 в 06:21
поделиться

Бросок в блоке выгоды без args повторно бросит то же исключение, которое было поймано, таким образом, это будет поймано в более высоком уровне.

Бросок за пределами блока выгоды без args вызовет завершение программы.

0
ответ дан 1 December 2019 в 06:21
поделиться

у меня есть мало понимания тот бросок; в основном "перебросок" и должен использоваться в обработчике исключений (выгода). Используя это понятие в каком-либо другом месте был бы результаты в завершение программы тогда, почему компилятор не повышает флаги во время компиляции?

Перебросок полезен. Предположим, что у Вас есть стек вызовов три уровня глубоко с каждым уровнем, добавляющим некоторый объект ресурса контекста для заключительного вызова. Теперь, когда у Вас есть исключение на уровне листа, Вы будете ожидать некоторую операцию очистки для любых ресурсов, которые создал объект. Но это не все, вызывающие стороны выше листа, возможно, также выделили некоторые ресурсы, которые должны будут быть освобождены. Как дела это? Вы перебросок .

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

0
ответ дан 1 December 2019 в 06:21
поделиться

Для завершения предыдущих ответов с примером того, когда/почему компилятор не может обнаружить проблему:

// Centralized exception processing (if it makes sense)
void processException()
{
   try {
      throw;
   }
   catch ( std::exception const & e )
   {
      std::cout << "Caught std::exception: " << e.what() << std::endl;
   }
   catch ( ... )
   {
      std::cout << "Caught unknown exception" << std::endl;
   }
}

int main()
{
   try
   {
      throw 1;
   }
   catch (...)
   {
      processException(); // correct, still in the catch clause
   }
   processException(); // terminate() no alive exception at the time of throw.
}

Когда компиляция функции processException компилятор не может знать, как и когда это назовут.

0
ответ дан 1 December 2019 в 06:21
поделиться

У Вас нет ничего для ловли, и таким образом, пузыри исключения полностью. Даже catch(...) потребности что-то .

-1
ответ дан 1 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

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