Независимо от того, был ли блок скомпилирован как сборка конечных версий, исключение должно, конечно, 'пузыриться' до вызывающей стороны, нет никакой причины, блок, не скомпилированный в режиме отладки, должен иметь любое влияние на этом.
я согласился бы с Daniel, предполагает, что, возможно, исключение происходит на отдельном потоке - пытаются сцепить событие исключения потока в Приложении. ThreadException. Это должно быть повышено, когда любое необработанное исключение потока происходит. Вы могли адаптировать свой thus:-
using System.Threading;
...
void Application_ThreadException(object sender, ThreadExceptionEventArgs e) {
throw new ParserException(e.Exception.Message, e.Exception);
}
...
var exceptionHandler =
new ThreadExceptionEventHandler(Application_ThreadException);
Application.ThreadException += exceptionHandler;
try {
// Execution stopped at parser.prog()
TimeDefParser.prog_return prog_ret = parser.prog();
return prog_ret == null ? null : prog_ret.value;
}
catch (Exception ex) {
throw new ParserException(ex.Message, ex);
}
finally {
Application.ThreadException -= exceptionHandler;
}
кода В Windows XP, если запись приложения - WinMain, конвертирует ли Windows командную строку из Unicode в Ansi и передает ли это приложению?
Да.
Если параметр командной строки должен быть в Unicode (например, имя файла Unicode, преобразование приведет к отсутствию некоторых символов), означает ли это, что я должен использовать wWinMain в качестве функции ввода?
Да, вам следует, если вы хотите правильно обрабатывать аргументы Unicode для ваша программа.
Документация к WinMain () в MSDN также согласна с этим.
Однако вы также можете использовать GetCommandLineW для получения командной строки специально в Unicode.
Начиная с версии Windows XP по умолчанию используется Unicode! Таким образом, преобразование не требуется. Загрузчик среды выполнения C ++ заботится о передаче аргументов приложению. Стандартный Win32 API требует, чтобы основной записью было WinMain (...).