'''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 AntiPattern''''''s''':ArrowAntiPattern '''Applicable Positive Patterns''':IfError FailFast '''AntiPatternCategory''': DevelopmentAntiPattern '''Also Known As''': [other names]