”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 提升 JavaScript 错误处理水平:从“try...catch”到自定义错误

提升 JavaScript 错误处理水平:从“try...catch”到自定义错误

发布于2024-12-22
浏览:909

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]删除
最新教程 更多>
  • 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...
    编程 发布于2025-07-04
  • 使用jQuery如何有效修改":after"伪元素的CSS属性?
    使用jQuery如何有效修改":after"伪元素的CSS属性?
    在jquery中了解伪元素的限制:访问“ selector 尝试修改“:”选择器的CSS属性时,您可能会遇到困难。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    编程 发布于2025-07-04
  • 图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    在chrome 在使用Chrome and IE9中的图像时遇到的一个频繁的问题是围绕图像的持续薄薄边框,尽管指定了图像,尽管指定了;和“边境:无;”在CSS中。要解决此问题,请考虑以下方法: Chrome具有忽略“ border:none; none;”的已知错误,风格。要解决此问题,请使用以下...
    编程 发布于2025-07-04
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-07-04
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-07-04
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-07-04
  • 为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    网格超过身体,用100%grid-template-columns 为什么在grid-template-colms中具有100%的显示器,当位置设置为设置的位置时,grid-template-colly修复了?问题: 考虑以下CSS和html: class =“ snippet-code”> g...
    编程 发布于2025-07-04
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-07-04
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-07-04
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c 的函数时,接受成员函数指针的函数时,必须同时提供对象的指针,并提供指针和指针到函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此)和成员函数指针。这可以通过修改Menubutton :: SetButton()(如下所示:[&& && && &&华)...
    编程 发布于2025-07-04
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“检测”中的错误:在功能检测中。”当Face Cascade分类器(即面部检测至关重要的组件)未正确加载时,通常会出现此错误。要解决此问题,必须...
    编程 发布于2025-07-04
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确预期操作结果的火灾和...
    编程 发布于2025-07-04
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-07-04
  • Java为何无法创建泛型数组?
    Java为何无法创建泛型数组?
    通用阵列创建错误 arrayList [2]; JAVA报告了“通用数组创建”错误。为什么不允许这样做?答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<myO...
    编程 发布于2025-07-04
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-07-04

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3