如何在 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 中的錯誤處理。

更新於:2022-12-08

162 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告