错误处理是编写健壮可靠的软件的一个重要方面。然而,不小心可能会导致代码混乱,难以阅读和维护。
《简洁代码》第 7 章深入探讨了处理错误的技术,这些技术不会使代码混乱,强调清晰性和简单性。
在本文中,我们将探讨本章中的关键概念以及如何在 JavaScript 中应用它们以保持代码库整洁和可维护。
干净代码的关键原则之一是优先选择异常而不是错误代码。
异常允许您将错误处理逻辑与主逻辑分开,使您的代码更具可读性。
示例:避免错误代码
function getUser(id) { const user = database.findUserById(id); if (user === null) { return -1; // Error code for user not found } return user; } const result = getUser(123); if (result === -1) { console.error('User not found'); } else { console.log(result); }
在这个例子中,错误处理与主逻辑交织在一起,使其更难以理解。
示例:使用异常
function getUser(id) { const user = database.findUserById(id); if (user === null) { throw new Error('User not found'); } return user; } try { const user = getUser(123); console.log(user); } catch (error) { console.error(error.message); }
通过使用异常,我们将错误处理逻辑与主逻辑分开,使代码更干净、更容易理解。
抛出异常时,提供有意义的错误消息来提供有关错误的上下文非常重要。
这有助于快速诊断问题,而无需深入研究代码。
示例:在错误消息中提供上下文
function getUser(id) { const user = database.findUserById(id); if (user === null) { throw new Error(`User with ID ${id} not found`); } return user; } try { const user = getUser(123); console.log(user); } catch (error) { console.error(error.message); // Outputs: User with ID 123 not found }
描述性错误消息提供了立即理解问题所需的上下文。
返回 null 可能会导致难以跟踪的 null 引用错误。
考虑抛出异常或使用提供默认行为的特殊情况模式,而不是返回 null。
示例:避免返回 Null
function getUser(id) { const user = database.findUserById(id); if (user === null) { return null; // This can lead to null reference errors } return user; } const user = getUser(123); if (user !== null) { console.log(user.name); }
返回 null 需要额外的检查,并且可能会使您的代码变得混乱。
示例:引发异常或使用特殊情况
function getUser(id) { const user = database.findUserById(id); if (user === null) { throw new Error(`User with ID ${id} not found`); } return user; } // OR class NullUser { get name() { return 'Guest'; } } function getUser(id) { const user = database.findUserById(id); return user || new NullUser(); }
引发异常或使用特殊情况对象(如 NullUser)有助于避免空引用错误并保持代码干净。
虽然 try-catch-finally 块对于处理异常至关重要,但过度使用它们会使您的代码变得混乱。
仅在必要时使用它们,并避免深层嵌套的块。
示例:避免过多的 Try-Catch
try { const data = JSON.parse(input); try { const user = getUser(data.id); try { sendEmail(user.email); } catch (error) { console.error('Failed to send email:', error.message); } } catch (error) { console.error('User retrieval failed:', error.message); } } catch (error) { console.error('Invalid JSON:', error.message); }
由于多个嵌套的 try-catch 块,此代码很难理解。
示例:重构以减少混乱
function parseInput(input) { try { return JSON.parse(input); } catch (error) { throw new Error('Invalid JSON'); } } function retrieveUser(data) { return getUser(data.id); } function notifyUser(user) { sendEmail(user.email); } try { const data = parseInput(input); const user = retrieveUser(data); notifyUser(user); } catch (error) { console.error(error.message); }
通过将逻辑分解为单独的函数,我们减少了嵌套并提高了可读性。
如果捕获异常,请确保正确处理。
默默地忽略异常可能会导致意外行为并使调试变得困难。
示例:不要忽略异常
try { const user = getUser(123); } catch (error) { // Ignoring the exception }
忽略异常可以掩盖代码中的潜在问题。
示例:处理或记录异常
try { const user = getUser(123); } catch (error) { console.error('An error occurred:', error.message); }
处理或记录异常可确保您了解任何问题并可以相应地解决这些问题。
有效的错误处理对于编写干净、可维护的 JavaScript 代码至关重要。
通过遵循《干净代码》中的原则,例如使用异常而不是错误代码、在错误消息中提供上下文、避免 null 返回、谨慎使用 try-catch 以及不忽略捕获的异常,您可以确保错误处理逻辑既坚固又不引人注目。
快乐编码!
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3