Подтвердить что ты не робот

Java - это плохая практика делать попытку/улов внутри try/catch?

У меня есть код, который я хочу выполнить, если произойдет исключение. Но этот код также может генерировать исключение. Но я никогда не видел, чтобы люди делали попытку/уловку внутри другого 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                     
            }
     } 

Кажется, это неловко. Может быть, что-то не так?

Спасибо!

4b9b3361

Ответ 1

Это хорошо, хотя, если ваша логика обработки исключений является такой сложной, вы можете рассмотреть ее в своей собственной функции.

Ответ 2

Плохая практика писать код с таким количеством уровней вложенности, особенно в 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 не является исключительной ситуацией, но это может произойти при нормальных обстоятельствах.

Ответ 3

Ответ: Нет. Это на 100% отлично. Возможно, вам придется использовать много из них в JDBC и IO, потому что у них есть много исключений для обработки, один внутри другого...

Ответ 4

Вот альтернативное решение, если вы не хотите использовать вложенные 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                     
        }