Вы упоминаете, что пытаетесь удалить файл "после исключения" - следовательно, ваш подход не на том пути и не будет работать как есть.
Если исключениеБрошенный более ранними методами (например, вызовом createNewFile()
), это исключение будет немедленно распространяться вверх, поэтому ваш вызов file.delete()
не сможет выполнить.Вам нужно было обернуть предыдущие операторы в блок try
и поместить вызов delete в соответствующий блок catch
или finally
, чтобы он выполнялся при возникновении исключения.
Вот пример того, что вы можете попытаться сделать:
if(canExport && fileCreated)
{
//Create the file
this.file.createNewFile();
try
{
this.run();
}
catch (IOException e)
{
try
{
file.delete();
}
catch (IOException ignore) {} // don't want to mask the real exception
// Rethrow the actual exception from run() so callers can handle it
throw e;
}
}
Альтернативный подход, вместо того, чтобы поймать IOExceptions
, состоит в том, чтобы иметь блок finally
(который всегда выполняется), а затем проверить условие тамНапример, ваш possible
флаг.
Также обратите внимание, что я запускаю блок try после вызова createNewFile()
- если в вызове create file выдается исключение, тогдафайл вообще не существует для удаления!
Как примечание к файлу, добавление «большого количества кода, требующего запуска потока заново» в вашем блоке обработки ошибок, вероятно, не лучший дизайн.Было бы более уместно просто рассмотреть возможность восстановления из ситуаций ввода-вывода, и позволил исключению всплыть наверх и заставить поток / runnable умереть.Логика вокруг перезапуска задач и / или воскрешения потоков была бы лучше позиционирована с классом, который запустил потоки в первую очередь (например, пул потоков / исполнитель задач / и т.д.).Разброс логики по всему коду усложнит понимание того, что делает какой-либо отдельный класс (не говоря уже о том, что наличие ресурсов класса Marshall для воскрешения * просто кажется неправильным с точки зрения ОО).