為什么 Visual Studio 錯誤日志顯示由某些錯誤引起的事情,而不是錯誤本身?我經常發現錯誤訊息毫無用處且毫無意義。
當我犯錯誤時,例如回圈依賴,它會拋出一堆錯誤,
syntax error: missing ';'而不是像circular dependency detected.
當我忘記包含一些標題并在我的代碼中使用它時,例如std::map,它只說'map' is not a member of 'std'
它永遠不會向您顯示實際問題,它只顯示癥狀。我知道有時僅憑此您就可以清楚地看出哪里出了問題,但我不想花時間弄清楚哪里出了問題。我只想盡快修復它。
為什么不能像帶有 Pycharm IDE 的 Python 那樣實際顯示實際錯誤?
uj5u.com熱心網友回復:
盡管這個問題可能被認為是題外話,但我會嘗試給出一個答案,以闡明為什么人們可能會認為表達的意見(無用且毫無意義)是“不公平的”。
首先,這不是 Visual Studio 的東西。如果您使用過其他 C 編譯器(gcc/clang/intel 編譯器),您會注意到錯誤非常相似。即使它們看起來“無用”,一點經驗也有很大幫助。錯誤不僅精確、準確和可重現,而且它們遵循標準規范并遵守語言的正式描述。
其次,在將 C 與 Python 進行比較時,我們必須劃清界限。C 是一種編譯語言,這意味著在創建可執行檔案之前,必須根據語言規則撰寫整個代碼。這意味著即使沒有執行運行時分支也會被檢查。另一方面,Python 是一種解釋型語言。這意味著它可以即時驗證代碼(在執行背景關系中具有更豐富的資訊),因此以下代碼可能會運行良好:
def main():
a = []
a.append(1)
print(a)
# return 9'999 out of 10'000 times
a.shoot_foot(2) # list object has no attribute 'shoot_foot'
if __name__ == '__main__':
main()
隨之而來的代價是錯誤(甚至不稱其為錯誤,因為它違反了語言規則)可能會在生產中隱藏和顯現。
第三,C 是一種強型別語言。這意味著型別是靜態檢查的,代價是要求您正確對待它們。與動態型別的 Python不同,物件的型別不能在運行時修改,這意味著在編程時以“小心”為代價增加了型別安全性。這是一種 JS vs TS 的東西,人們習慣了不同的風格;對我來說,缺乏型別安全是我在使用 Python 時最懷念的事情。這種能力的代價是在進行型別檢查時會出現一些最復雜的錯誤訊息。
最后,C 正朝著改進錯誤訊息的方向積極發展,使其資訊量更大、更短。這不是一項容易的任務,但概念等特性允許程式員明確他們對型別系統施加的限制。此外,諸如靜態斷言之類的防御性編程技術可以引入“失敗開關”,提前停止編譯,從而減少錯誤并僅保留有關攻擊性代碼的資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385432.html
