--porcelain
опция!? --porcelain
, опция и тогда использует вывод для сценариев - в основном, авторы мерзавца неявно обещают не изменить что-либо там в ближайшее время. например, Я могу использовать git status --porcelain
и использовать вывод для сценариев, и это было бы в порядке. , Если английский язык не является Вашим первым языком тогда , Greg Hewgill объясняет это отлично. Для большего количества детали, контроль VonC ответ.
Спасибо всем за вклад. Это хорошие предложения для всех, кто сталкивается с подобной проблемой. Сейчас он работает, но я не уверен на 100%, какое из внесенных мною изменений заставило вещи снова стать нормальными. И снова подход, заключающийся в упрощении до чего-то, что работает, и наращивания оттуда окупился.
Одна вещь, которая не была упомянута в ответах и которая, я думаю, была частью моего замешательства, - это убедиться, что обработчик дает понять, что действительно перехватил исключение. Я думаю, что в некоторых из моих формулировок обработчика это маскировалось и передавалось исключение обработчику более высокого уровня.
Попробуйте использовать блок catch (...) {}
, чтобы проверить, действительно ли генерируется исключение.
Я подозреваю, что во всем виновато взаимодействие между 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 ++, но он может применяться. Я могу предложить две теории:
-fobjc-exceptions
. Одна малоизвестная проблема с исключениями относится к доступу к базовому классу.
Если вы фактически создаете класс, который является производным от 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» не рассматривается.
Это может быть маловероятно, но в настройках компилятора Visual Studio есть возможность полностью отключить исключения. Возможно, что-то подобное есть в GCC / XCode.
Исключения C ++ могут быть практически любыми, довольно часто char *
. Как предлагалось ранее, добавьте catch (...)
, чтобы хотя бы заставить его сломаться и посмотреть, что происходит.
C ++ позволяет использовать различные варианты перехвата: значение, ссылку или указатель. Обратите внимание, что этот код перехватывает только std :: exceptions, переданные по ссылке или значению:
try {
// some code that throws a std::exception
}
catch (std::exception &e) {
// handle the exception
}
Вероятно, что исключение передается по указателю:
catch (std::exception* e)
Проверьте код, который генерирует исключение, и посмотрите, как он это делает.
Как отмечает Марк, если вы ловите по значению, а не по ссылке, вы рискуете разрезать свой объект.