Reputation: 17185
I have some code that I want to execute if an exception happens. But that code can also generate an exception. But I have never seen people do a try/catch inside another try/catch.
Is what I am doing poor practice and maybe there is a better way of doing this:
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
}
}
It seems kind of awkward. Is there something that might be wrong with it?
Upvotes: 64
Views: 66336
Reputation: 49
Here is alternate solution if you don't want to use nested try and catch, You can also do it like this:
boolean flag = false;
void test();
if(flag)
{
test2();
}
Test Method goes here:
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;
}
}
Now put the rest code in 2nd Method:
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
}
Upvotes: 0
Reputation: 340708
It is a bad practice to write code with so many levels of nesting, especially in try-catch
- so I would say: avoid. On the other hand throwing an exception from catch
block is unforgivable sin, so you should be very careful.
My advice - extract your catch
logic into a method (so catch
block is simple) and make sure this method will never throw anything:
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
}
}
Also it seems (I might be wrong) that you are using exceptions to control program flow. Consider standard return value if throwing ActivityNotFoundException
is not an exceptional situation but it might happen under normal circumstances.
Upvotes: 10
Reputation: 22995
Answer is No..It is 100% fine.. You might have to use lot of these in JDBC and IO, because they have lot of exceptions to be handled, one inside another...
Upvotes: 6
Reputation: 1074018
It's fine, although if your exception handling logic is that complex, you might consider breaking it out into its own function.
Upvotes: 52