簡體   English   中英

在MATLAB中使用try和catch語句進行調試

[英]debugging with try and catch statements in MATLAB

我在MATLAB文件中有一條try / catch語句,該語句調用了一堆嵌套函數。 簡而言之,try / catch在“最高”級別上運行,迭代一個我調用其功能的文件列表。

for i=1:length(FILELIST)
try
dosomething(FILELIST(i)
catch
disp(exception.message)
rethrow(exception)
end

我的問題是,說dosomething()有很多子功能dosomethingchild()我該如何訪問它的調試工作區? 我將必須刪除所有父級中的try / catch語句,以便在“錯誤/警告”設置為“滿”的情況下使用“ STop”訪問調試工作空間。

try / catch使調試變得更加困難,但我想保留它,因為有時由於文件的性質,代碼會在某些文件上失敗,而不是代碼本身。

提前致謝。

只需刪除try..catch 由於您僅顯示並重新提交錯誤,而沒有實際捕獲到任何特定的錯誤,因此,對於由文件的性質引起的錯誤,要使其健壯可靠,則生產代碼不可行。 它的行為與沒有try..catch的情況相同,因此在發生錯誤后它將停止執行。

stop if error啟用了stop if error功能,它將停止在錯誤處理程序中,這已經是沒有用的了。 從那里不可能返回到被調用函數的工作空間,因為這些工作空間已經關閉(調用已經返回)。

在實際情況中,如果還dbstop if caught errortry..catch dbstop if caught error ,也可以嘗試dbstop if caught error ,但是在這種情況下,我建議您擺脫try..catch或至少使其捕獲特定的錯誤。 您可能還想立即發現(特定)錯誤。 離實際發生的距離越遠,通常對特定錯誤的理解就越少。

為什么不將keyboard添加到catch語句中,並檢查代碼失敗時發生的情況。

Generall我同意Egon的觀點,即try / catch塊根本沒有幫助。 但是,對於您的調試情況,這可能不是最壞的主意。 我對調試此代碼的建議:

  1. 除去重新拋出的內容, dbstop if errordbstop if error執行dbstop if error以切換到調試模式。 或者,在與disp(execption.message)的行上放置一個斷點。
  2. 現在您可以做兩件事:
    • 運行該腳本,當絕對由無效輸入文件引起的錯誤發生時,您可以捕獲該錯誤並進行實際處理(通常顯示一條錯誤消息,名稱為xyz.csv的文件已被忽略)
    • 如果您不知道錯誤的根源, 現在可以在doSomething()函數中放置一個斷點,最好將其盡可能地靠近該錯誤(該錯誤為您提供了調用棧,因此您應該變得非常接近),然后從控制台再次手動執行doSomething() 它會在您的斷點處停止,然后您可以單步執行(快捷方式:F10)或進入子功能(單步執行F11)。
  3. 有時,錯誤消息會在原始錯誤發生之后出現,那么您將不得不重復這些步驟。 但是,一旦使用了某個函數,便可以使用該函數的完整工作區,因此可以手動(再次)執行所有先前的命令,以回溯出問題的地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM