diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2015-07-08 13:43:40 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2015-07-08 13:43:40 +0100 |
| commit | 123541822b079dd49229f10d8b37c6babcd71dc6 (patch) | |
| tree | 18a353b237683a99f37c7617e76749c81c7a186b /src | |
| parent | f65d41a30aabe328d753deb2edf0ec1d3af03487 (diff) | |
Gracefully handle exception when opening files given on command line
Fixes #310
Diffstat (limited to 'src')
| -rw-r--r-- | src/buffer_manager.cc | 5 | ||||
| -rw-r--r-- | src/main.cc | 29 |
2 files changed, 23 insertions, 11 deletions
diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc index 43aa2f58..e468a0d9 100644 --- a/src/buffer_manager.cc +++ b/src/buffer_manager.cc @@ -11,7 +11,10 @@ namespace Kakoune { -struct name_not_unique : logic_error {}; +struct name_not_unique : runtime_error +{ + name_not_unique() : runtime_error("buffer name is already in use") {} +}; BufferManager::~BufferManager() { diff --git a/src/main.cc b/src/main.cc index 1be088a8..6a92f9f8 100644 --- a/src/main.cc +++ b/src/main.cc @@ -228,7 +228,7 @@ void register_options() } template<typename UI> -void create_local_client(StringView init_command, bool kakrc_error) +void create_local_client(StringView init_command, bool startup_error) { struct LocalUI : UI { @@ -262,9 +262,9 @@ void create_local_client(StringView init_command, bool kakrc_error) static Client* client = ClientManager::instance().create_client( make_unique<LocalUI>(), get_env_vars(), init_command); - if (kakrc_error) + if (startup_error) client->print_status({ - "error while sourcing kakrc, see *debug* buffer for details", + "error during startup, see *debug* buffer for details", get_face("Error") }); @@ -395,7 +395,7 @@ int run_server(StringView session, StringView init_command, Server server(session.empty() ? to_string(getpid()) : session.str()); - bool kakrc_error = false; + bool startup_error = false; if (not ignore_kakrc) try { Context initialisation_context{Context::EmptyContextFlag{}}; @@ -404,12 +404,12 @@ int run_server(StringView session, StringView init_command, } catch (Kakoune::runtime_error& error) { - kakrc_error = true; + startup_error = true; write_to_debug_buffer(format("error while parsing kakrc:\n {}", error.what())); } catch (Kakoune::client_removed&) { - kakrc_error = true; + startup_error = true; write_to_debug_buffer("error while parsing kakrc: asked to quit"); } @@ -424,8 +424,17 @@ int run_server(StringView session, StringView init_command, // is the most recently created one. for (auto& file : reversed(files)) { - if (not create_buffer_from_file(file)) - new Buffer(file.str(), Buffer::Flags::New | Buffer::Flags::File); + try + { + if (not create_buffer_from_file(file)) + new Buffer(file.str(), Buffer::Flags::New | Buffer::Flags::File); + } + catch (Kakoune::runtime_error& error) + { + startup_error = true; + write_to_debug_buffer(format("error while opening file '{}':\n {}", + file, error.what())); + } } } catch (Kakoune::runtime_error& error) @@ -438,9 +447,9 @@ int run_server(StringView session, StringView init_command, if (not daemon) { if (dummy_ui) - create_local_client<DummyUI>(init_command, kakrc_error); + create_local_client<DummyUI>(init_command, startup_error); else - create_local_client<NCursesUI>(init_command, kakrc_error); + create_local_client<NCursesUI>(init_command, startup_error); } while (not terminate and (not client_manager.empty() or daemon)) |
