Ответ 1
Это хорошо, хотя, если ваша логика обработки исключений является такой сложной, вы можете рассмотреть ее в своей собственной функции.
У меня есть код, который я хочу выполнить, если произойдет исключение. Но этот код также может генерировать исключение. Но я никогда не видел, чтобы люди делали попытку/уловку внутри другого try/catch.
Я делаю плохую практику, и, возможно, есть лучший способ сделать это:
Uri uri = Uri.parse("some url");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
try
{
startActivity(intent);
}
catch (ActivityNotFoundException anfe)
{
// Make some alert to me
// Now try to redirect them to the web version:
Uri weburi = Uri.parse("some url");
try
{
Intent webintent = new Intent(Intent.ACTION_VIEW, weburi);
startActivity(webintent);
}
catch ( Exception e )
{
// Make some alert to me
}
}
Кажется, это неловко. Может быть, что-то не так?
Спасибо!
Это хорошо, хотя, если ваша логика обработки исключений является такой сложной, вы можете рассмотреть ее в своей собственной функции.
Плохая практика писать код с таким количеством уровней вложенности, особенно в try-catch
, поэтому я бы сказал: избегайте. С другой стороны, исключение из блока catch
исключает непростительный грех, поэтому вы должны быть очень осторожны.
Мой совет - извлеките логику catch
в метод (так что блок catch
прост) и убедитесь, что этот метод никогда не бросит ничего:
Uri uri = Uri.parse("some url");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
try
{
startActivity(intent);
}
catch (ActivityNotFoundException anfe)
{
// Make some alert to me
// Now try to redirect them to the web version:
Uri weburi = Uri.parse("some url");
Intent webintent = new Intent(Intent.ACTION_VIEW, weburi);
silentStartActivity(webintent)
}
//...
private void silentStartActivity(Intent intent) {
try
{
startActivity(webintent);
}
catch ( Exception e )
{
// Make some alert to me
}
}
Также кажется (я могу ошибаться), что вы используете исключения для управления потоком программы. Рассмотрим стандартное возвращаемое значение, если выбраковка ActivityNotFoundException
не является исключительной ситуацией, но это может произойти при нормальных обстоятельствах.
Ответ: Нет. Это на 100% отлично. Возможно, вам придется использовать много из них в JDBC и IO, потому что у них есть много исключений для обработки, один внутри другого...
Вот альтернативное решение, если вы не хотите использовать вложенные try и catch, Вы также можете сделать это следующим образом:
boolean flag = false;
void test();
if(flag)
{
test2();
}
Здесь идет тестовый метод:
private void test(){
try {
Uri uri = Uri.parse("some url");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}catch (ActivityNotFoundException anfe){
System.out.println(anfe);
flag =true;
}
}
Теперь поместите код останова во 2-й метод:
public void test2(){
Uri weburi = Uri.parse("some url");
try
{
Intent webintent = new Intent(Intent.ACTION_VIEW, weburi);
startActivity(webintent);
}
catch ( Exception e )
{
// Make some alert to me
}