Я переношу некоторый код из VS2010 (используя boost 1.55) в VS 2015 (используя boost 1.60).Почему boost :: filesystem прерывается, а не бросает исключение?
В итоге я получаю «Библиотека времени выполнения Microsoft Visual C++», сообщающую, что abort() has been called
, в то время как boost rties генерирует исключение. Тем не менее, я мог заставить его выбросить другие исключения без каких-либо проблем (и используется для работы с VS2010/boost1.55):
#include <boost/filesystem.hpp>
#include <boost/filesystem/operations.hpp>
#include <iostream>
int main(int argc, char* argv[])
{
// Stepping to folder:
try
{
boost::filesystem::current_path("B:/dev/msvc2015/vobs_bci/public/tst/base/cppunit/utlfile");
std::cout << "Worked" << std::endl; // works OK
}
catch (...)
{
}
// test throwing upon copy_directory because dource folder does not exist:
try
{
boost::filesystem::copy_directory("s", "b");
}
catch (...)
{
std::cout << "Caught" << std::endl; // works OK
}
// test throwing upon copy because target file already exists:
try
{
boost::filesystem::copy("./test.h", "./copied.cpp"); // works
boost::filesystem::copy("./test.h", "./copied.cpp"); // should throw and be caught
}
catch (...)
{
std::cout << "Caught" << std::endl; // never reached...
}
std::cout << "Done" << std::endl;
return 0;
}
Этот выход:
Worked
Caught
-> then aborts!
С отладчика, я вижу, что прервать вызывается, когда функция ошибки ниже (в файловой системе/SRC/operations.cpp) вызывает BOOST_FILESYSTEM_THROW
:
bool error(err_t error_num, const path& p1, const path& p2, error_code* ec,
const char* message)
{
if (!error_num)
{
if (ec != 0) ec->clear();
}
else
{ // error
if (ec == 0)
BOOST_FILESYSTEM_THROW(filesystem_error(message,
p1, p2, error_code(error_num, system_category()))); // << Here!
else
ec->assign(error_num, system_category());
}
return error_num != 0;
}
Я проверил с помощью отладчика, и я достигаю filesystem_error
строи tor и может выйти из него без каких-либо проблем, следующий шаг (нажатие F11 в отладчике должно быть вызвано throw
), abort()
вызывается.
Странно то, что когда copy_directory
бросает исключение, он также работает, и это называют точно так же, error
функцию в filesystem/src/operations.cpp
.
стек вызовов на прерывании является:
> ntdll.dll!KiUserExceptionDispatcher() Inconnu
KernelBase.dll!RaiseException() Inconnu
vcruntime140d.dll!_CxxThrowException(void * pExceptionObject=0x000000000019f670, const _s__ThrowInfo * pThrowInfo=0x000000013fd01870) Ligne 136 C++
test_3rdparty_inprg_boost.exe!`anonymous namespace'::error(unsigned long error_num=80, const boost::filesystem::path & p1={...}, const boost::filesystem::path & p2={...}, boost::system::error_code * ec=0x0000000000000000, const char * message=0x000000013fcf6fb8) Ligne 321 C++
test_3rdparty_inprg_boost.exe!boost::filesystem::detail::copy_file(const boost::filesystem::path & from={...}, const boost::filesystem::path & to={...}, boost::filesystem::detail::copy_option option=none, boost::system::error_code * ec=0x0000000000000000) Ligne 919 C++
test_3rdparty_inprg_boost.exe!boost::filesystem::copy_file(const boost::filesystem::path & from={...}, const boost::filesystem::path & to={...}, boost::filesystem::copy_option option=none, boost::system::error_code & ec) Ligne 550 C++
test_3rdparty_inprg_boost.exe!boost::filesystem::detail::copy(const boost::filesystem::path & from={...}, const boost::filesystem::path & to={...}, boost::system::error_code * ec=0x0000000000000000) Ligne 894 C++
test_3rdparty_inprg_boost.exe!boost::filesystem::copy(const boost::filesystem::path & from={...}, const boost::filesystem::path & to={...}) Ligne 524 C++
test_3rdparty_inprg_boost.exe!main(int argc=1, char * * argv=0x00000000003f3cc0) Ligne 35 C++
test_3rdparty_inprg_boost.exe!invoke_main() Ligne 75 C++
Но я не могу увидеть исходный код ntdll.dll!KiUserExceptionDispatcher()
ни KernelBase.dll!RaiseException()
.
'abort()' вызывает сигнал, который вызывает аномальное завершение ('SIGABRT'), а не исключение. Исключения 'catch' cath исключений, а не сигналов. Это означает, что обнаружена ошибка, и перед запуском исключения вызывается 'abort'. – mikedu95
@ mikedu95 Вопрос, как я вижу, не потому, что 'abort()' не может быть пойман, а скорее почему (и, возможно, где) 'abort()' вообще вызывается. – hvd
@ mikedu95 Но когда я нажимаю «Retry» на всплывающем меню «Microsft Visual C++ Runtime Library», это приводит меня к строке 'BOOST_FILESYSTEM_THROW'. Почему это прерывается, а не бросает? – jpo38