In the spirit of Are there well-solved and simple storage patterns for Solidity?...
Are there known, battle-tested practices for how to deal with errors in large Solidity codebases?
It's common in software engineering to have a clear collection of error names, codes and descriptions, usually implemented via enums. The only project I've seen which adheres to this rigorous take on error handling is Compound, but there must be more. Compound's codebase is big and interwoven with other finesses like formal verification scripts, so their's is not strictly the best implementation to refer to when answering this question.