如何在 Clojurescript 中捕获任何 JavaScript 异常?
在我们的代码中,通常会遇到错误问题。错误会干扰应用程序的正常流程。因此,需要在代码中处理错误异常才能在任何编程语言中实现任何应用程序。现在,我们将了解如何在 Clojurescript 中处理异常。在此之前,我们先了解什么是 Clojurescript。
什么是 ClojureScript?
从根本上说,Clojurescript 是 Closure 编程语言的一个方言,用于编译成 JavaScript。实际上,Closure 最初只编译成 Java 虚拟机字节码,后来在 2011 年,Clojurescript 作为一种将 Closure 引入客户端开发的选项出现。
Clojurescript 的构建层次高于 JavaScript。在 JavaScript 中,通常处理变量、循环、条件、函数、数组和对象。对于 Clojurescript,我们处理表达式、集合、序列和转换。当我们查看 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 中错误处理的知识。