DEV Community

Cover image for Code Smell 184 - Exception Arrow Code
Maxi Contieri
Maxi Contieri

Posted on • Edited on • Originally published at maximilianocontieri.com

Code Smell 184 - Exception Arrow Code

Arrow code is a code smell. Exception polluting is another. This is a mortal combination.

TL;DR: Don't cascade your exceptions

Problems

  • Readability

  • Complexity

Solutions

  1. Rewrite the nested clauses

Context

In the same way arrow code is hard to read, handling exceptions is a usual case when we must address the topics in a cascade way.

Sample Code

Wrong

class QuotesSaver {
    public void Save(string filename) {
        if (FileSystem.IsPathValid(filename)) {
            if (FileSystem.ParentDirectoryExists(filename)) {
                if (!FileSystem.Exists(filename)) {
                    this.SaveOnValidFilename(filename);
                } else {
                    throw new I0Exception("File exists: " + filename);
                }
            } else {
                throw new I0Exception("Parent directory missing at " + filename);
            }
        } else {
            throw new ArgumentException("Invalid path " + filename);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Right

public class QuoteseSaver {
    public void Save(string filename) {
        if (!FileSystem.IsPathValid(filename)) {
            throw new ArgumentException("Invalid path " + filename);
        } else if (!FileSystem.ParentDirectoryExists(filename)) {
            throw new I0Exception("Parent directory missing at " + filename);
        } else if (FileSystem.Exists(filename)) {
             throw new I0Exception("File exists: " + filename);
        }
        this.SaveOnValidFilename(filename);
    }
}
Enter fullscreen mode Exit fullscreen mode

Detection

[X] Semi-Automatic

Some linters warn us when we have this kind of complexity

Tags

  • Exceptions

Conclusion

Exceptions are less critical than normal cases.

If we need to read more exceptional code than normal then it is time to improve our code.

Relations

Disclaimer

Code Smells are just my opinion.

Credits

Photo by Remy Gieling on Unsplash


An error doesn't become a mistake until you refuse to correct it.

Orlando Aloysius Battista


This article is part of the CodeSmell Series.

Top comments (3)

Collapse
 
htho profile image
Hauke T.

In this case I'd skip the else keyword completely.
Nothing is executed after throw.
It is similar to an early return.

If the style allows it, I'd skip the curly braces, but only if the if and throw fit into one line

Collapse
 
rouilj profile image
John P. Rouillard

I assume

this.SaveOnValidFilename(filename);
Enter fullscreen mode Exit fullscreen mode

should go after the closing } on the if/elseif chain?

Collapse
 
mcsee profile image
Maxi Contieri

exactly.

I spotted it.
Thank you!