如何在 Clojurescript 中捕获任何 JavaScript 异常?
在我们的代码中,通常我们会遇到错误问题。错误会干扰应用程序的正常流程。因此,需要在我们的代码中处理错误异常,以便在任何编程语言中实现任何应用程序。现在,我们将了解如何在 Clojurescript 中处理异常。在此之前,我们先了解一下什么是 Clojurescript。
什么是 ClojureScript?
从根本上说,Closurescript 是 Closure 编程语言的一个方言,用于编译成 JavaScript。实际上,Closure 最初仅编译为 Java 虚拟机字节码,后来在 2011 年,Closurescript 作为一种将 Closure 引入客户端开发的选项出现。
Closurescript 的构建层次高于 JavaScript。在 JavaScript 中,通常会处理变量、循环、条件、函数、数组和对象。在 Closurescript 中,我们处理表达式、集合、序列和转换。当我们查看 Clojurescript 的许多使其与 JavaScript 不同的特性时。
除了细微的差别外,它们实际上是相同的语言。不同之处在于目标环境。Closure 建立在 Java 虚拟机上,并与 Java 集成。ClojureScript 编译成 JavaScript,并在浏览器或 Node.js 环境中运行。
现在,让我们看一个如何在 JS 和 ClosureScript 中进行函数调用的示例。
在面向对象的 JS 函数调用中 -
employeeRecords.findOne("employee details");
这里,employeeRecords 是一个对象,findOne 是一个函数,“employee details” 是参数。
在 JavaScript 函数调用中 -
findOne(employeeRecords, "employee details");
这里,findOne 是一个函数,employeeRecords,“employee details” 是参数。
同样的例子,我们来看一下 Closurescript
(findOne employeeRecords "employee details");
这里,findOne 函数和 employeeRecords “employee details” 是参数。在 Clojurescript 中,与函数式 JavaScript 代码唯一的区别在于左括号移到了左侧,并且参数之间没有逗号。
Clojurescript 编译器最重要的特性之一是它生成 Google Closure 模块,然后利用 Closure 编译器来优化 JavaScript。
处理错误异常
在错误异常中,我们有两个类别,例如
扩展 Throwable 类的类期望 RuntimeException,即检查异常。例如 IOException、SQLException 等。这些在编译时进行检查。
扩展 RuntimeExceptions 的类,即未检查异常,如 NullPointerException、ArithmeticException、ArrayIndexOutOfBoundException。它们在运行时而不是编译时进行检查。
示例
让我们举个例子。
(ns clojureScript.examples (:gen-class)) ;; This program displays employee details (defn Example [] (def employee (slurp "Employee.txt")) (println employee)) (Example)
输出
这里,slurp 用于读取文件中的所有内容。我们可以观察到 Employee.txt 文件不存在。因此,它将输出 FileNotFoundException。
使用 try/catch/finally 处理
在 Clojurescript 中处理错误异常与其在 JavaScript 中的处理方式更为相似。ClojureScript 提供了一种称为 try 的特殊形式,它编译成 JavaScript 中的 try/catch 结构。让我们看一个例子
示例
(ns clojureScript.examples (:gen-class)) ;; This program displays employee details (defn Example [] (try (def employee (slurp "Employee.txt")) (catch Exception e (println (str "caught exception: " (.toString e)))) (finally (println "This is our final block, it will execute always"))) (println "Let's move on")) (Example)
输出
这里,Employee.txt 是一个不存在的文件。FileNotFoundException 由 catch 块处理。
示例
让我们检查另一个示例,当我们尝试访问数组中不存在的更大索引时。
(ns clojureScript.examples (:gen-class)) ;; This program displays employee details (defn Example [] (try (aget (int-array [1 2 3 4]) 5) (catch Exception e (println (str "caught exception: " (.toString e)))) (finally (println "This is our final block, it will execute always"))) (println "Let's move on")) (Example)
输出
这里,我们尝试从数组 [1 2 3 4] 中访问 5 个索引,因此 ArrayIndexOutOfBoundException 由 catch 块处理。
在catch块中,您可以编写自定义代码来处理我们的异常。这样我们就可以无错误地运行我们的应用程序。
finally块位于 try 块或 catch 块之后。无论是否发生异常,finally 代码块始终都会执行。
我们可以使用多个 catch 块来处理多种类型的异常。每个 catch 块都取决于我们的代码中引发的异常类型。
示例
让我们举个例子
(ns Clojurescript.example (:gen-class)) (defn Example [] (try (def string1 (slurp "Example.txt")) (println string1) (catch java.lang.ArrayIndexOutOfBoundsException e (println (str "caught file exception: " (.getMessage e)))) (catch Exception e (println (str "caught exception: " (.getMessage e)))) (finally (println "This is our final block, it will execute always"))) (println "Let's move on")) (Example)
输出
使用任何 Clojure IDE 在线编辑器执行此程序。像这样,我们将处理 ClosureScript 中的异常。希望本文能让你了解 ClosureScript 和 ClosureScript 中的错误处理。