diff --git a/aegisub/src/ass_dialogue.cpp b/aegisub/src/ass_dialogue.cpp index 8d7b0f8bc..96b7688cc 100644 --- a/aegisub/src/ass_dialogue.cpp +++ b/aegisub/src/ass_dialogue.cpp @@ -46,6 +46,8 @@ #include "ass_dialogue.h" #include "ass_override.h" +#include "compat.h" +#include "subtitle_format.h" #include "utils.h" AssDialogue::AssDialogue() @@ -82,7 +84,7 @@ AssDialogue::AssDialogue(wxString const& data) , Style("Default") { if (!Parse(data)) - throw "Failed parsing line."; + throw SubtitleFormatParseError(STD_STR("Failed parsing line: " + data), 0); } AssDialogue::~AssDialogue () { diff --git a/aegisub/src/ass_file.cpp b/aegisub/src/ass_file.cpp index 266e6a636..0d5310569 100644 --- a/aegisub/src/ass_file.cpp +++ b/aegisub/src/ass_file.cpp @@ -79,11 +79,9 @@ AssFile::~AssFile() { /// @brief Load generic subs void AssFile::Load(const wxString &_filename, wxString const& charset) { - try { - // Get proper format reader - const SubtitleFormat *reader = SubtitleFormat::GetReader(_filename); - if (!reader) throw "Unknown file type"; + const SubtitleFormat *reader = SubtitleFormat::GetReader(_filename); + try { AssFile temp; reader->ReadFile(&temp, _filename, charset); diff --git a/aegisub/src/ass_parser.cpp b/aegisub/src/ass_parser.cpp index 64800f392..24903ae17 100644 --- a/aegisub/src/ass_parser.cpp +++ b/aegisub/src/ass_parser.cpp @@ -20,6 +20,7 @@ #include "ass_dialogue.h" #include "ass_file.h" #include "ass_style.h" +#include "subtitle_format.h" #ifndef AGI_PRE #include @@ -83,7 +84,7 @@ void AssParser::ParseScriptInfoLine(wxString const& data) { else if (versionString == "v4.00+") trueVersion = 1; else - throw "Unknown SSA file format version"; + throw SubtitleFormatParseError("Unknown SSA file format version", 0); if (trueVersion != version) { wxLogMessage("Warning: File has the wrong extension."); version = trueVersion; diff --git a/aegisub/src/ass_style.cpp b/aegisub/src/ass_style.cpp index 1d05f1cea..4c8902cb8 100644 --- a/aegisub/src/ass_style.cpp +++ b/aegisub/src/ass_style.cpp @@ -44,6 +44,7 @@ #endif #include "ass_style.h" +#include "subtitle_format.h" #include "utils.h" AssColor::AssColor () { @@ -172,21 +173,21 @@ AssStyle::AssStyle() } static wxString get_next_string(wxStringTokenizer &tok) { - if (!tok.HasMoreTokens()) throw "Malformed style: not enough fields"; + if (!tok.HasMoreTokens()) throw SubtitleFormatParseError("Malformed style: not enough fields", 0); return tok.GetNextToken(); } static int get_next_int(wxStringTokenizer &tok) { long temp; if (!get_next_string(tok).ToLong(&temp)) - throw "Malformed style: could not parse int field"; + throw SubtitleFormatParseError("Malformed style: could not parse int field", 0); return temp; } static double get_next_double(wxStringTokenizer &tok) { double temp; if (!get_next_string(tok).ToDouble(&temp)) - throw "Malformed style: could not parse double field"; + throw SubtitleFormatParseError("Malformed style: could not parse double field", 0); return temp; } @@ -265,7 +266,7 @@ AssStyle::AssStyle(wxString rawData, int version) encoding = get_next_int(tkn); if (tkn.HasMoreTokens()) - throw "Malformed style: too many fields"; + throw SubtitleFormatParseError("Malformed style: too many fields", 0); UpdateData(); } diff --git a/aegisub/src/dialog_style_manager.cpp b/aegisub/src/dialog_style_manager.cpp index 9cb320a4e..1f564839b 100644 --- a/aegisub/src/dialog_style_manager.cpp +++ b/aegisub/src/dialog_style_manager.cpp @@ -600,14 +600,6 @@ void DialogStyleManager::OnCurrentImport() { try { temp.Load(filename); } - catch (const char *err) { - wxMessageBox(err, "Error", wxOK | wxICON_ERROR | wxCENTER, this); - return; - } - catch (wxString const& err) { - wxMessageBox(err, "Error", wxOK | wxICON_ERROR | wxCENTER, this); - return; - } catch (agi::Exception const& err) { wxMessageBox(lagi_wxString(err.GetChainedMessage()), "Error", wxOK | wxICON_ERROR | wxCENTER, this); } diff --git a/aegisub/src/frame_main.cpp b/aegisub/src/frame_main.cpp index 7aac9be37..6300cf42f 100644 --- a/aegisub/src/frame_main.cpp +++ b/aegisub/src/frame_main.cpp @@ -455,14 +455,6 @@ void FrameMain::LoadSubtitles(wxString const& filename, wxString const& charset) config::mru->Remove("Subtitle", STD_STR(filename)); return; } - catch (const char *err) { - wxMessageBox(err, "Error", wxOK | wxICON_ERROR | wxCENTER, this); - return; - } - catch (wxString const& err) { - wxMessageBox(err, "Error", wxOK | wxICON_ERROR | wxCENTER, this); - return; - } catch (agi::Exception const& err) { wxMessageBox(lagi_wxString(err.GetChainedMessage()), "Error", wxOK | wxICON_ERROR | wxCENTER, this); } diff --git a/aegisub/src/subtitle_format.cpp b/aegisub/src/subtitle_format.cpp index a2a865144..2606d0cdb 100644 --- a/aegisub/src/subtitle_format.cpp +++ b/aegisub/src/subtitle_format.cpp @@ -331,21 +331,21 @@ void SubtitleFormat::DestroyFormats() { } template -SubtitleFormat *find_or_null(Cont &container, Pred pred) { +SubtitleFormat *find_or_throw(Cont &container, Pred pred) { typename Cont::iterator it = find_if(container.begin(), container.end(), pred); if (it == container.end()) - return 0; + throw UnknownSubtitleFormatError("Subtitle format for extension not found", 0); return *it; } const SubtitleFormat *SubtitleFormat::GetReader(wxString const& filename) { LoadFormats(); - return find_or_null(formats, bind(&SubtitleFormat::CanReadFile, _1, filename)); + return find_or_throw(formats, bind(&SubtitleFormat::CanReadFile, _1, filename)); } const SubtitleFormat *SubtitleFormat::GetWriter(wxString const& filename) { LoadFormats(); - return find_or_null(formats, bind(&SubtitleFormat::CanWriteFile, _1, filename)); + return find_or_throw(formats, bind(&SubtitleFormat::CanWriteFile, _1, filename)); } wxString SubtitleFormat::GetWildcards(int mode) { diff --git a/aegisub/src/subtitle_format.h b/aegisub/src/subtitle_format.h index 6e94a3330..91e90d1c6 100644 --- a/aegisub/src/subtitle_format.h +++ b/aegisub/src/subtitle_format.h @@ -146,3 +146,4 @@ public: }; DEFINE_SIMPLE_EXCEPTION(SubtitleFormatParseError, agi::InvalidInputException, "subtitle_io/parse/generic") +DEFINE_SIMPLE_EXCEPTION(UnknownSubtitleFormatError, agi::InvalidInputException, "subtitle_io/unknown")