use std::exception instead of std::runtime_error as restricting outselves doesn't buy anything