」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼我可以在評估程式碼中捕獲語法錯誤,但在原始程式碼中卻不能?

為什麼我可以在評估程式碼中捕獲語法錯誤,但在原始程式碼中卻不能?

發佈於2024-11-16
瀏覽:780

Why can I catch syntax errors in eval\'d code but not in my source code?

處理 Eval 程式碼中的語法錯誤

使用 Python 程式碼時,您可能會遇到使用 eval 函數動態求值的程式碼中出現語法錯誤的情況。雖然可以捕獲此類錯誤,但原始程式碼本身的語法錯誤卻並非如此。

為什麼會有差異?

要理解這種行為,記住以下內容至關重要: Python 中的執行順序。當程式碼執行時,Python編譯器首先解析並編譯程式碼,產生字節碼。然後,Python 虛擬機器 (PVM) 解釋此字節碼。

如果原始程式碼中存在語法錯誤,編譯器會遇到錯誤並停止編譯過程。因此,程式碼中定義的 try/ except 區塊永遠不會發揮作用。

但是,當使用 eval 時,eval 語句中的程式碼會在第一次編譯周圍程式碼後單獨編譯。這意味著 eval 語句中的任何語法錯誤都會在第二次編譯運行期間發生。由於在第一次編譯期間已經建立了 try/ except 區塊,因此可以捕獲由 eval'd 程式碼引發的語法錯誤。

含義

無法捕獲原始程式碼可能會令人沮喪。但這就是 Python 實作的固有限制。編譯器必須在 try/except 機制啟動之前完成第一次執行。

解決方法

要處理原始程式碼中的語法錯誤,必須找到多次觸發編譯過程的方法。這可以使用以下技術來實現:

  • 將程式碼包裝在eval 語句中
  • 使用編譯內建函數
  • 從單獨的檔案匯入程式碼
  • 使用exec 或execfile
最新教學 更多>
  • 如何使用 CSS 響應式地建立具有兩個不同邊框的圓?
    如何使用 CSS 響應式地建立具有兩個不同邊框的圓?
    響應式設計具有雙邊框的圓圈創建 CSS 圓圈非常簡單,如提供的工作 CSS 所示。然而,要實現具有兩個不同邊框的圓,我們需要採用額外的 CSS 技術。 使用提供的HTML 結構,其中單一 元素代表圓:<div></div>我們可以如下修改CSS來創建一個有兩個邊框的圓:div...
    程式設計 發佈於2024-11-16
  • 如何在單一 MySQL 操作中聲明任務的所有權並檢索其資料?
    如何在單一 MySQL 操作中聲明任務的所有權並檢索其資料?
    透過單一操作在MySQL 中實現行所有權和資料擷取:當使用多個工作程序應用程式循環執行任務時,它確保每個應用程式有效地聲明對唯一任務的所有權可能具有挑戰性。 MySQL 提供了 UPDATE 和 SELECT 命令來完成此操作,但單獨執行它們可能會引入延遲和潛在的競爭條件。 要簡化流程,請考慮以下方...
    程式設計 發佈於2024-11-16
  • 如何處理 ReactJS 中的 GET 請求重新導向和 CORS 錯誤?
    如何處理 ReactJS 中的 GET 請求重新導向和 CORS 錯誤?
    在ReactJS 中處理GET 請求重定向和CORS 錯誤當ReactJS 應用程式向伺服器發送GET 請求並接收時遇到CORS錯誤302 重定向可能是一個令人沮喪的問題。以下提供了此問題的解決方案:要解決您的場景中的 CORS 錯誤,其中 ReactJS 前端 (f.com) 請求路徑“/user...
    程式設計 發佈於2024-11-16
  • 如何在 React Router v4/v5 中建立嵌套路由?
    如何在 React Router v4/v5 中建立嵌套路由?
    React Router v4/v5 的嵌套路由嵌套路由可讓您在 React 應用程式中建立用於導航的分層結構。在 React Router v4 和 v5 中,您可以透過使用 和 元件來實現這一點。 範例考慮以下範例,我們希望將應用程式劃分為前端和管理區域。 <Match pattern...
    程式設計 發佈於2024-11-16
  • 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-11-16
  • 如何在 PHP 迴圈中建立動態變​​數?
    如何在 PHP 迴圈中建立動態變​​數?
    循環中的動態變數建立:綜合答案要在循環中建立變數,您可以採用以下技術:1。基於循環計數器的變數:如您所提到的,您希望變數隨著每次循環迭代而遞增。為此,您可以使用以下語法:for ( $counter = 1; $counter <= $aantalZitjesBestellen; $count...
    程式設計 發佈於2024-11-16
  • 如何衡量 Go 整合測試的測試覆蓋率?
    如何衡量 Go 整合測試的測試覆蓋率?
    確定Go 整合測試中的測試覆蓋率整合測試旨在評估整個系統的功能,通常透過模擬或控制外部依賴。然而,確定整合測試的測試覆蓋率提出了獨特的挑戰。 測量非包測試中的覆蓋率在所描述的場景中,測試與包是分開的他們測試。因此, go test -cover 指令報告覆蓋率為 0%。為了解決這個問題,可以使用 -...
    程式設計 發佈於2024-11-16
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-11-16
  • C++ 程式設計師如何使用 NPAPI 開發強大的瀏覽器外掛程式?
    C++ 程式設計師如何使用 NPAPI 開發強大的瀏覽器外掛程式?
    製作瀏覽器外掛:C 程式設計師指南增強網頁瀏覽器的專業功能需要開發瀏覽器外掛程式。然而,編寫這些插件的過程提出了問題,特別是對於打算使用 C 為 Windows 編寫插件的人。 開發瀏覽器外掛程式的關鍵在於利用 Netscape 外掛程式介面 (NPAPI)。 NPAPI 使開發人員能夠建立處理特定...
    程式設計 發佈於2024-11-16
  • 如果 `std::move` 實際上沒有移動任何東西,為什麼它被稱為 `std::move`?
    如果 `std::move` 實際上沒有移動任何東西,為什麼它被稱為 `std::move`?
    為什麼 std::move 命名為 std::move? std::move 函數儘管有它的名字,但它實際上並沒有移動任何東西。它只是將左值(引用物件的表達式)轉換為右值(表示臨時物件的表達式)。此轉換是透過轉換為 xvalue 類別來執行的,這與左值和純右值不同。 這種命名選擇的原因可以追溯到該概...
    程式設計 發佈於2024-11-16
  • 如何在懸停時使元素背景顏色變暗而不影響透明度?
    如何在懸停時使元素背景顏色變暗而不影響透明度?
    使用CSS 使元素背景顏色變暗增強用戶界面涉及透過改變交互元素(例如按鈕)的外觀來突出顯示它們。一種常見的方法是在懸停時使背景顏色變暗。 最初,人們可能會嘗試調整不透明度,但這會影響顏色和透明度。存在更有針對性的解決方案。 方法:疊加深色圖層使用背景影像建立深色疊加層。此方法保留了原始文字顏色,同時...
    程式設計 發佈於2024-11-16
  • CSS3 轉換與 jQuery 動畫:iPad HTML5 應用程式哪個更快?
    CSS3 轉換與 jQuery 動畫:iPad HTML5 應用程式哪個更快?
    效能比較:CSS3 轉換與jQuery 動畫在iPad HTML5 應用程式中,您實現了觸控事件以提高回應速度並利用用於元素操作的jQuery。然而,您正在爭論是使用 jQuery 動畫還是 CSS3 動畫轉換。讓我們深入研究一下它們的性能比較。 根據基準研究,jQuery 動畫的執行速度明顯慢於 ...
    程式設計 發佈於2024-11-16
  • 三元條件運算子在程式設計中如何運作?
    三元條件運算子在程式設計中如何運作?
    理解三元條件運算子程式設計中,使用問號(「?」)和冒號(「:」)運算子括號內形成三元條件運算子。它提供了傳統 if-else 語句的簡潔替代方案,可讓您評估條件並根據其真實性分配值。 語法和用法The三元運算子遵循語法:boolean_expression ? true_value : false_...
    程式設計 發佈於2024-11-16
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-16
  • 如何存取 Maven 依賴項的原始程式碼和 Javadoc?
    如何存取 Maven 依賴項的原始程式碼和 Javadoc?
    在 Maven 儲存庫中尋找來源 JARMaven 是一種流行的 Java 專案包管理工具,提供了廣泛的庫及其依賴項儲存庫。通常,開發人員需要存取與這些依賴項關聯的原始程式碼或 Javadoc,以進行偵錯或文件記錄。 雖然Maven 儲存庫通常儲存二進位JAR 文件,但有一種方法可以使用Maven ...
    程式設計 發佈於2024-11-16

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

Copyright© 2022 湘ICP备2022001581号-3