」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 提升 JavaScript 錯誤處理等級:從「try...catch」到自訂錯誤

提升 JavaScript 錯誤處理等級:從「try...catch」到自訂錯誤

發佈於2024-12-22
瀏覽:124

Level Up Your JavaScript Error Handling: From `try...catch` to Custom Errors

错误处理是每个 JavaScript 开发人员都会遇到的事情之一,但并不是每个人都深入掌握它。如果您一直依赖简单的 try...catch 语句,那么是时候提升您的游戏水平了。这篇文章将带您完成从基本错误处理到制作自定义错误的整个过程,使您的代码更具弹性且更易于调试。

1. 基础知识:try...catch

让我们从经典的 try...catch 开始:

try {
  const data = JSON.parse('{"name": "John"}');
  console.log(data.age.toUpperCase()); // This will cause an error
} catch (error) {
  console.error("Something went wrong:", error);
}

这既简单又有效。 try 块允许您运行可能引发错误的代码,catch 块捕获它,让您可以优雅地处理它。

但是,随着应用程序的增长,仅仅依赖于此可能会导致信息量较少的错误消息,这使得调试成为一场噩梦。这就是自定义错误处理的亮点。

2. 了解本机错误类型

JavaScript自带内置错误类型,如:

  • 错误:通用错误对象。
  • TypeError:当变量不是预期类型时抛出。
  • SyntaxError:当代码包含语法错误时抛出。
  • ReferenceError:引用不存在的变量时抛出。

例子:

try {
  let result = myUndefinedFunction();
} catch (error) {
  if (error instanceof ReferenceError) {
    console.error("ReferenceError detected:", error.message);
  } else {
    console.error("Unexpected error:", error);
  }
}

通过利用这些类型,您可以开始构建更具描述性的错误处理路径。但是,如果您想定义特定于您的应用程序逻辑的错误怎么办?这就是自定义错误出现的地方。

3. 创建自定义错误

为什么会出现自定义错误?

自定义错误有助于识别代码中的特定问题,从而使调试变得更加容易。例如,如果您正在构建 API,您可能需要区分 ValidationError、AuthenticationError 或 DatabaseError。

如何创建自定义错误

让我们创建一个 ValidationError 为例:

class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = "ValidationError";
  }
}

try {
  const age = -5;
  if (age 



通过扩展 Error 类,我们能够创建更有意义的 ValidationError。这种方法可以清晰地了解问题的本质,使调试更容易,代码更干净。

4. 用更多信息丰富自定义错误

为什么只停留在自定义消息上?让我们使用 errorCode 或 statusCode 等附加属性来丰富我们的自定义错误。

class HttpError extends Error {
  constructor(statusCode, message) {
    super(message);
    this.name = "HttpError";
    this.statusCode = statusCode;
  }
}

try {
  const response = { status: 404 };
  if (response.status === 404) {
    throw new HttpError(404, "Resource not found");
  }
} catch (error) {
  if (error instanceof HttpError) {
    console.error(`Error ${error.statusCode}: ${error.message}`);
  } else {
    console.error("Unexpected error:", error);
  }
}

这样,您可以捕获有关错误的更多上下文,从而更容易有效地采取行动或记录。

5. 构建全局错误处理策略

随着应用程序的扩展,您将需要一种集中的方式来处理错误。一种方法是创建一个错误处理实用程序来处理不同的错误类型。

function handleError(error) {
  if (error instanceof ValidationError) {
    console.error("Validation failed:", error.message);
  } else if (error instanceof HttpError) {
    console.error(`HTTP error (${error.statusCode}):`, error.message);
  } else {
    console.error("An unexpected error occurred:", error);
  }
}

try {
  throw new HttpError(500, "Internal Server Error");
} catch (error) {
  handleError(error);
}

这种集中式错误处理有助于保持代码干燥(不要重复自己),并确保整个应用程序中错误处理的一致性。

6. 最终利用清理

通常,您可能需要执行清理任务,例如关闭数据库连接或清除超时。这就是终于派上用场的地方:

try {
  // Attempt to execute code
} catch (error) {
  // Handle errors
} finally {
  console.log("This will always execute, whether an error occurred or not.");
}

使用finally可以确保无论是否抛出错误,该块都会执行,这使其成为清理操作的理想选择。

7. 与日志服务集成

对于生产应用程序,记录错误至关重要。 Sentry、LogRocket 或 Datadog 等服务可以通过完整的堆栈跟踪捕获错误,从而使故障排除变得更加容易。

例子:

import * as Sentry from '@sentry/browser';

Sentry.init({ dsn: 'YOUR_SENTRY_DSN' });

try {
  // Your code that might throw an error
} catch (error) {
  Sentry.captureException(error);
  handleError(error);
}

此集成可以更好地了解问题,并帮助您实时监控应用程序的运行状况。

最后的想法

通过超越 try...catch 的基础知识并合并自定义错误,您可以创建更易于维护、更易读和更健壮的 JavaScript 代码。实施这些实践不仅可以使调试变得轻而易举,还可以提高应用程序的整体可靠性。

接下来是什么?

  • 在当前项目中尝试自定义错误。
  • 实施集中式错误处理程序。
  • 在您的应用程序中集成错误日志记录服务。

让我知道您如何处理项目中的错误,或者您是否有任何很酷的提示和技巧可以分享!


喜欢这篇文章吗?关注我,了解更多 JavaScript 提示和技巧!

版本聲明 本文轉載於:https://dev.to/amdzakir/level-up-your-javascript-error-handling-from-trycatch-to-custom-errors-jge?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-23
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-23
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-23
  • Go可以存取初始標準輸入流嗎?
    Go可以存取初始標準輸入流嗎?
    在 Go 中,您可以存取初始標準輸入嗎? 在 Go 中,使用 os.Stdin 從原始標準輸入讀取應該會產生所需的結果,如圖所示通過這個代碼片段:package main import "os" import "log" import "io&quo...
    程式設計 發佈於2024-12-23
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-23
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-23
  • 極簡密碼管理器桌面應用程式:進軍 Golang 的 Wails 框架(第 2 部分)
    極簡密碼管理器桌面應用程式:進軍 Golang 的 Wails 框架(第 2 部分)
    Hi again, coders! In the first part of this short series we saw the creation and operation of a desktop application to store and encrypt our passwords...
    程式設計 發佈於2024-12-23
  • ES6 React 元件:何時使用基於類別與函數式?
    ES6 React 元件:何時使用基於類別與函數式?
    在ES6 基於類別和函數式ES6 React 元件之間做出選擇使用React 時,開發人員面臨著使用ES6 基於類別的選擇組件或功能ES6 組件。了解每種類型的適當用例對於最佳應用程式開發至關重要。 函數式 ES6 元件:無狀態且簡單函數式元件是無狀態的,這表示它們不維護任何內部狀態。他們只是接收道...
    程式設計 發佈於2024-12-23
  • 如何在 PHP 中找到兩個平面數組之間的唯一值?
    如何在 PHP 中找到兩個平面數組之間的唯一值?
    在平面數組之間查找唯一值給定兩個數組,任務是確定僅存在於其中一個數組中的值。此操作通常稱為尋找兩個集合之間的差異。 在 PHP 中,您可以利用 array_merge、array_diff 和 array_diff 函數來實現此操作。詳細解法如下:$array1 = [64, 98, 112, 92...
    程式設計 發佈於2024-12-23
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-12-23
  • CSS 可以在內聯區塊元素中本機插入換行符號嗎?
    CSS 可以在內聯區塊元素中本機插入換行符號嗎?
    CSS 在行內區塊元素中插入換行符:理論探索在不斷發展的Web 開發領域,這種能力操縱內容流仍然是最重要的。經常出現的一個特殊挑戰涉及在內聯區塊元素中插入換行符。 考慮以下 HTML 結構:<h3 id="features">Features</h3> &...
    程式設計 發佈於2024-12-23
  • 如何在 PHP 中輕鬆轉換時區之間的時間和日期?
    如何在 PHP 中輕鬆轉換時區之間的時間和日期?
    在PHP 中轉換時區之間的時間和日期使用PHP,您可以輕鬆地在不同時區之間轉換時間和日期。此功能在處理全球資料的應用程式或與來自不同位置的使用者一起工作時特別有用。 取得時區偏移量要取得與 GMT 的時間偏移量,您可以使用 DateTimeZone 類別。它提供了時區及其各自偏移量的完整清單。 $t...
    程式設計 發佈於2024-12-23
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-23
  • 如何在Windows上安裝並使用Pip進行Python套件管理?
    如何在Windows上安裝並使用Pip進行Python套件管理?
    Pip:在Windows 上安裝Python 套件的輕鬆方式在Windows 上安裝Python 套件可能是一項艱鉅的任務,特別是如果您在使用EasyInstall 時遇到困難。幸運的是,EasyInstall 的後繼者 Pip 提供了更簡化和簡化的解決方案。 在Windows 上逐步安裝Pip若要...
    程式設計 發佈於2024-12-23
  • 如何在Python的`type()`和`isinstance()`之間進行選擇以進行物件類型檢查?
    如何在Python的`type()`和`isinstance()`之間進行選擇以進行物件類型檢查?
    如何確定物件的類型確定物件的類型對於保證資料一致性並相應地執行操作至關重要。 Python 為此目的提供了兩個內建函數:type() 和 isinstance()。 使用 type()type() 函數傳回確切的型別一個物件的。例如:>>> type([]) is list Tru...
    程式設計 發佈於2024-12-23

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3