Throw only real exceptions from subtitle io stuff

This commit is contained in:
Thomas Goyne 2012-10-25 06:45:06 -07:00
parent 78b70e987e
commit ff6394c95e
8 changed files with 17 additions and 30 deletions

View file

@ -46,6 +46,8 @@
#include "ass_dialogue.h" #include "ass_dialogue.h"
#include "ass_override.h" #include "ass_override.h"
#include "compat.h"
#include "subtitle_format.h"
#include "utils.h" #include "utils.h"
AssDialogue::AssDialogue() AssDialogue::AssDialogue()
@ -82,7 +84,7 @@ AssDialogue::AssDialogue(wxString const& data)
, Style("Default") , Style("Default")
{ {
if (!Parse(data)) if (!Parse(data))
throw "Failed parsing line."; throw SubtitleFormatParseError(STD_STR("Failed parsing line: " + data), 0);
} }
AssDialogue::~AssDialogue () { AssDialogue::~AssDialogue () {

View file

@ -79,11 +79,9 @@ AssFile::~AssFile() {
/// @brief Load generic subs /// @brief Load generic subs
void AssFile::Load(const wxString &_filename, wxString const& charset) { void AssFile::Load(const wxString &_filename, wxString const& charset) {
try { const SubtitleFormat *reader = SubtitleFormat::GetReader(_filename);
// Get proper format reader
const SubtitleFormat *reader = SubtitleFormat::GetReader(_filename);
if (!reader) throw "Unknown file type";
try {
AssFile temp; AssFile temp;
reader->ReadFile(&temp, _filename, charset); reader->ReadFile(&temp, _filename, charset);

View file

@ -20,6 +20,7 @@
#include "ass_dialogue.h" #include "ass_dialogue.h"
#include "ass_file.h" #include "ass_file.h"
#include "ass_style.h" #include "ass_style.h"
#include "subtitle_format.h"
#ifndef AGI_PRE #ifndef AGI_PRE
#include <wx/log.h> #include <wx/log.h>
@ -83,7 +84,7 @@ void AssParser::ParseScriptInfoLine(wxString const& data) {
else if (versionString == "v4.00+") else if (versionString == "v4.00+")
trueVersion = 1; trueVersion = 1;
else else
throw "Unknown SSA file format version"; throw SubtitleFormatParseError("Unknown SSA file format version", 0);
if (trueVersion != version) { if (trueVersion != version) {
wxLogMessage("Warning: File has the wrong extension."); wxLogMessage("Warning: File has the wrong extension.");
version = trueVersion; version = trueVersion;

View file

@ -44,6 +44,7 @@
#endif #endif
#include "ass_style.h" #include "ass_style.h"
#include "subtitle_format.h"
#include "utils.h" #include "utils.h"
AssColor::AssColor () { AssColor::AssColor () {
@ -172,21 +173,21 @@ AssStyle::AssStyle()
} }
static wxString get_next_string(wxStringTokenizer &tok) { 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(); return tok.GetNextToken();
} }
static int get_next_int(wxStringTokenizer &tok) { static int get_next_int(wxStringTokenizer &tok) {
long temp; long temp;
if (!get_next_string(tok).ToLong(&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; return temp;
} }
static double get_next_double(wxStringTokenizer &tok) { static double get_next_double(wxStringTokenizer &tok) {
double temp; double temp;
if (!get_next_string(tok).ToDouble(&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; return temp;
} }
@ -265,7 +266,7 @@ AssStyle::AssStyle(wxString rawData, int version)
encoding = get_next_int(tkn); encoding = get_next_int(tkn);
if (tkn.HasMoreTokens()) if (tkn.HasMoreTokens())
throw "Malformed style: too many fields"; throw SubtitleFormatParseError("Malformed style: too many fields", 0);
UpdateData(); UpdateData();
} }

View file

@ -600,14 +600,6 @@ void DialogStyleManager::OnCurrentImport() {
try { try {
temp.Load(filename); 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) { catch (agi::Exception const& err) {
wxMessageBox(lagi_wxString(err.GetChainedMessage()), "Error", wxOK | wxICON_ERROR | wxCENTER, this); wxMessageBox(lagi_wxString(err.GetChainedMessage()), "Error", wxOK | wxICON_ERROR | wxCENTER, this);
} }

View file

@ -455,14 +455,6 @@ void FrameMain::LoadSubtitles(wxString const& filename, wxString const& charset)
config::mru->Remove("Subtitle", STD_STR(filename)); config::mru->Remove("Subtitle", STD_STR(filename));
return; 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) { catch (agi::Exception const& err) {
wxMessageBox(lagi_wxString(err.GetChainedMessage()), "Error", wxOK | wxICON_ERROR | wxCENTER, this); wxMessageBox(lagi_wxString(err.GetChainedMessage()), "Error", wxOK | wxICON_ERROR | wxCENTER, this);
} }

View file

@ -331,21 +331,21 @@ void SubtitleFormat::DestroyFormats() {
} }
template<class Cont, class Pred> template<class Cont, class Pred>
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); typename Cont::iterator it = find_if(container.begin(), container.end(), pred);
if (it == container.end()) if (it == container.end())
return 0; throw UnknownSubtitleFormatError("Subtitle format for extension not found", 0);
return *it; return *it;
} }
const SubtitleFormat *SubtitleFormat::GetReader(wxString const& filename) { const SubtitleFormat *SubtitleFormat::GetReader(wxString const& filename) {
LoadFormats(); 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) { const SubtitleFormat *SubtitleFormat::GetWriter(wxString const& filename) {
LoadFormats(); 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) { wxString SubtitleFormat::GetWildcards(int mode) {

View file

@ -146,3 +146,4 @@ public:
}; };
DEFINE_SIMPLE_EXCEPTION(SubtitleFormatParseError, agi::InvalidInputException, "subtitle_io/parse/generic") DEFINE_SIMPLE_EXCEPTION(SubtitleFormatParseError, agi::InvalidInputException, "subtitle_io/parse/generic")
DEFINE_SIMPLE_EXCEPTION(UnknownSubtitleFormatError, agi::InvalidInputException, "subtitle_io/unknown")