AntiPattern Name: If Ok
Context: Almost every language that requires error handling code.
Problem: Error handling can obfuscate business logic and make code much harder to maintain. People think that because error handling is a good thing, that ALL error handling code is good. In reality, only 'good' error handling code is good.
The Fallacy: "Statements ABC should only execute if everything is ok. Therefore, I should put ABC inside an IfOk block".
Example:
if(ok) {
callA()
callB()
callC()
},
else
throwException()
Scale this up and we get:
if(ok){
callA()
if(A_ok){
callB()
callC()
if(B_Ok AND C_ok){
callD()
callE()
callF()
callG()
},
else
throwException("Method A failed")
},
else
throwException("Method B or C failed")
},
else
throwException()
The business logic should have been as simple as ABC but the error-handling code has caused problems:
- Obfuscated business logic.
- Error handler is far from the error.
- Lots of unnecessary nesting
Actual Solution: Use the IfError pattern.
- Separate error-handling code from business logic code.
- Remove unnecessary levels of nesting.
- Keep error handlers near the errors
- Less code
Example:
callA()
if(A_error)
throwException()
callB()
callC()
if(B_error OR C_error)
throwException()
callD()
callE()
callF()
callG()
Related AntiPatterns:ArrowAntiPattern
Applicable Positive Patterns:IfError FailFast
AntiPatternCategory: DevelopmentAntiPattern
Also Known As: [other names]