Почему мои исключения C++ не поймали?

Фарфор по сравнению с Инфраструктурой
  • существует два типа команд: "poreclain" и "инфраструктура".
  • " Фарфор " команды не должен полагаться при программировании/сценариях: потому что они, вероятно, изменятся и предназначены для людей не машины.
  • " Инфраструктура " команды должна использоваться для сценариев, потому что они более стабильны, и, менее вероятно, изменятся.

, Но что относительно путания --porcelain опция!?

  • , Если Вы хотите: (i) использовать команду фарфора И (ii) Вам, хотят гарантировать, что вывод предназначен, чтобы быть проанализированным (помните, команды фарфора предназначены для людей только и не анализирующий), тогда Вы можете добавлять --porcelain, опция и тогда использует вывод для сценариев - в основном, авторы мерзавца неявно обещают не изменить что-либо там в ближайшее время. например, Я могу использовать git status --porcelain и использовать вывод для сценариев, и это было бы в порядке.

, Куда фарфор/инфраструктура прибывает из?

, Если английский язык не является Вашим первым языком тогда , Greg Hewgill объясняет это отлично. Для большего количества детали, контроль VonC ответ.

8
задан gauss256 4 September 2009 в 06:03
поделиться

8 ответов

Спасибо всем за вклад. Это хорошие предложения для всех, кто сталкивается с подобной проблемой. Сейчас он работает, но я не уверен на 100%, какое из внесенных мною изменений заставило вещи снова стать нормальными. И снова подход, заключающийся в упрощении до чего-то, что работает, и наращивания оттуда окупился.

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

-2
ответ дан 5 December 2019 в 04:38
поделиться

Попробуйте использовать блок catch (...) {} , чтобы проверить, действительно ли генерируется исключение.

16
ответ дан 5 December 2019 в 04:38
поделиться

Я подозреваю, что во всем виновато взаимодействие между Objective-C и C ++, но все мои попытки определить это провалились.

Вы, вероятно, правы, хотя это трудно отследить .

Во-первых, GCC явно не позволяет вам генерировать исключения в Objective C ++ и перехватывать их в C ++ («при ​​использовании из Objective-C ++ модель исключений Objective-C не взаимодействует с исключениями C ++. в настоящее время. Это означает, что вы не можете @throw исключение из Objective-C и перехватить его в C ++, или наоборот (то есть throw ... @catch ). ")

Однако, я думаю, вы описываете случай, когда Objective C ++ вызывает код C ++, код C ++ выдает ошибку, и вы надеетесь, что код C ++ перехватит исключение. К сожалению, Я' m не могу найти документацию по этому конкретному случаю. Есть некоторая надежда, потому что: « Считается безопасным бросать исключение C ++ из одного файла в другой файл, скомпилированный для модели исключений Java, или наоборот, но в этой области могут быть ошибки . " Если они могут сделать это для Java, есть шанс, что они смогут сделать это для Objective C ++.

По крайней мере, вам нужно будет указать -fexceptions во время компиляции («вам может понадобиться чтобы включить эту опцию при компиляции кода C, который должен правильно взаимодействовать с обработчиками исключений, написанными на C ++ "). Опять же, здесь конкретно не упоминается Objective C ++, но он может применяться.

Мне нужно указать -fexceptions во время компиляции («вам может потребоваться включить этот параметр при компиляции кода C, который должен правильно взаимодействовать с обработчиками исключений, написанными на C ++»). Опять же, здесь конкретно не упоминается Objective C ++, но он может применяться.

Мне нужно указать -fexceptions во время компиляции («вам может потребоваться включить эту опцию при компиляции кода C, который должен правильно взаимодействовать с обработчиками исключений, написанными на C ++»). Опять же, здесь конкретно не упоминается Objective C ++, но он может применяться.

7
ответ дан 5 December 2019 в 04:38
поделиться

Я могу предложить две теории:

  1. исключение перехватывается до того, как доходит до вашего предложения catch; любая функция в стеке может быть виновата. Как предлагает Майкл, попробуйте поймать все.
  2. при раскручивании исключения не удается найти ваш обработчик. Чтобы проанализировать это более подробно, вам придется пройти через код очистки исключения, который очень сложен. Посмотрите, помогает ли компиляция кода Objective-C с -fobjc-exceptions .
3
ответ дан 5 December 2019 в 04:38
поделиться

Одна малоизвестная проблема с исключениями относится к доступу к базовому классу.

Если вы фактически создаете класс, который является производным от std :: exception , тогда обработчик std :: exception не будет выбран.

Например:

#include <iostream>

class A { };
class B : private A { } ;

int main ()
{
  try
  {
    throw B ();
  }
  catch (A & )
  {
    std::cout << "Caught an 'A'" << std::endl;
  }
  catch (B & )
  {
    std::cout << "Caught an 'B'" << std::endl;
  }
}

Обычно такой порядок обработчиков приводит к тому, что обработчик 'B' никогда не выбирается, но в этот случай «B» дервиется из «A» конфиденциально, поэтому обработчик catch для типа «A» не рассматривается.

5
ответ дан 5 December 2019 в 04:38
поделиться

Это может быть маловероятно, но в настройках компилятора Visual Studio есть возможность полностью отключить исключения. Возможно, что-то подобное есть в GCC / XCode.

1
ответ дан 5 December 2019 в 04:38
поделиться

Исключения C ++ могут быть практически любыми, довольно часто char * . Как предлагалось ранее, добавьте catch (...) , чтобы хотя бы заставить его сломаться и посмотреть, что происходит.

0
ответ дан 5 December 2019 в 04:38
поделиться

C ++ позволяет использовать различные варианты перехвата: значение, ссылку или указатель. Обратите внимание, что этот код перехватывает только std :: exceptions, переданные по ссылке или значению:

try {
  // some code that throws a std::exception
}
catch (std::exception &e) {
  // handle the exception
}

Вероятно, что исключение передается по указателю:

catch (std::exception* e)

Проверьте код, который генерирует исключение, и посмотрите, как он это делает.

Как отмечает Марк, если вы ловите по значению, а не по ссылке, вы рискуете разрезать свой объект.

16
ответ дан 5 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

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