Есть ли другой способ, которым люди обычно
оправиться от ошибок, как это, когда вы
хотите повторить операцию после
обрабатываете исключение?
Да, в коде вызова. Пусть вызывающий этот метод решит, нужно ли ему повторить логику или нет.
UPDATE:
Чтобы уточнить, вы должны ловить исключения, только если вы действительно можете их обработать. Ваш код в основном говорит:
«Я понятия не имею, что случилось, но что бы я ни делал, все это вызывало
взорвать ... так что давайте сделаем это снова. "
Поймайте конкретные ошибки, которые вы можете исправить, и позвольте остальным всплыть до следующего уровня, который нужно обработать. Любые исключения, которые делают это до самого верха, представляют истинные ошибки в этой точке.
ОБНОВЛЕНИЕ 2:
Хорошо, поэтому вместо продолжения довольно продолжительного обсуждения с помощью комментариев я разработаю пример с полупсевдокодом.
Общая идея заключается в том, что вам просто нужно реструктурировать код для выполнения тестов и немного лучше справляться с пользовательским интерфейсом.
//The main thread might look something like this
try{
var database = LoadDatabaseFromUserInput();
//Do other stuff with database
}
catch(Exception ex){
//Since this is probably the highest layer,
// then we have no clue what just happened
Logger.Critical(ex);
DisplayTheIHaveNoIdeaWhatJustHappenedAndAmGoingToCrashNowMessageToTheUser(ex);
}
//And here is the implementation
public IDatabase LoadDatabaseFromUserInput(){
IDatabase database = null;
userHasGivenUpAndQuit = false;
//Do looping close to the control (in this case the user)
do{
try{
//Wait for user input
GetUserInput();
//Check user input for validity
CheckConfigFile();
CheckDatabaseConnection();
//This line shouldn't fail, but if it does we are
// going to let it bubble up to the next layer because
// we don't know what just happened
database = LoadDatabaseFromSettings();
}
catch(ConfigFileException ex){
Logger.Warning(ex);
DisplayUserFriendlyMessage(ex);
}
catch(CouldNotConnectToDatabaseException ex){
Logger.Warning(ex);
DisplayUserFriendlyMessage(ex);
}
finally{
//Clean up any resources here
}
}while(database != null);
}
Теперь, очевидно, я понятия не имею, что пытается сделать ваше приложение, и, скорее всего, это не рабочий пример. Надеюсь, вы получите общее представление. Перестройте программу, чтобы избежать ненужных перерывов в работе приложения.
Ура,
Джош