Throw() inside include/function<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我有一段代碼被許多腳本使用,所以我把它轉移到一個包含文件中。此代碼執行檢查並在失敗時拋出。但是,我發現它只會終止在 include 中運行的腳本,之後它會選擇並開始運行最初調用 include 的代碼。這種行為我稱之為軟殺。我需要包含的 throw() 來殺死“兩個”腳本。
軟終止在其他語言中很常見,但在函數內部運行,這樣你就可以讓一段代碼無提示地失敗。但是,函數內部的 throw() 似乎實際上很難殺死所有正在運行的腳本。
例子:
throwTest.jsl
打印( “A” ) ;
包括( “~路徑\throwTest.include.jsl” ) ;
打印( “D” ) ;
投擲測試=功能({} , {默認本地} ,
打印( “E” ) ;
扔() ;
打印( “F” ) ;
) ;
投擲測試() ;
打印( “G” ) ;
throwTest.include.jsl
打印( “乙” ) ;
扔() ;
打印( “C” ) ;
日誌輸出:
“A” “B” “D” “E”
有誰知道如何從包含的腳本中硬殺死 JSL?
回复:Throw() inside include/function太好了,謝謝克雷奇@JMP !屆時我將期待 JMP 13。
回复:Throw() inside include/functionJMP 13(定於 9 月)解決了這個問題;該修復程序將要求您在包含周圍添加 try(...)。(try 不會捕獲來自 12.2 中包含的拋出)。如果沒有嘗試,JMP 13 的行為將與 12.2 相同。
聯合行動計劃 13:
打印(“A”);
嘗試(包括(“$desktop\throwTest.include.jsl”),打印(“抓住”)) ;
打印(“D”);
throwTest = Function({}, {默認本地},
打印(“E”);
扔();
打印(“F”);
);
拋出測試();
打印(“G”);
“A” “B” “抓住” “D” “E”
回复:Throw() inside include/function我的看法不同。
如果您只想運行“很多東西”、“許多不同類型的函數”,那麼沒有什麼能阻止您將許多函數放在一個腳本中。您甚至可以在不拋出整個腳本的情況下進行錯誤檢查並停止運行函數。 -- 請參閱下面的 Return() 腳本。
includes 的目的是減少您必須編寫完全相同的腳本的次數。
如果我有 100 個不同的腳本,所有腳本都定義 a=1; b=2; c=3; ... 以此類推 zz=702,您不會希望全部輸入 100 次。如果沒有包含,您很可能會輸入一次並複制並粘貼到您的其他腳本中。但是,如果您最終發現錯誤怎麼辦?您必須進入 100 個腳本並手動修復代碼。一個乏味的工作。但是,如果您最終找到了一種更快的方法來執行定義所有這些變量的相同任務,該怎麼辦?您必須在所有腳本中重構您的代碼 100 次。如果你決定你真的想要 a=2; 怎麼辦? b = 3 ...等。您必須更改代碼 100 次。更改 100 個腳本是一項容易出錯的任務,如果您錯過了一個腳本、進行了錯誤的更改等怎麼辦?
includes 的目的不是創建一個可以殺死奴隸並拯救主人的奴隸/主人關係。我們有這方面的功能。includes的目的是為了節省編碼時間。
(注意:include 的另一個目的是幫助保持腳本語言獨立,從而易於調試並保持代碼整潔。包含在使用 HTML/CSS/JavaScript 的 Web 應用程序中特別有用,但這並不真正適用於 JSL。)
傳遞檢查變量有一些問題,不是很多,而是一些。如果另一個腳本使用相同的檢查變量怎麼辦?如果我決定更改檢查變量怎麼辦?如果我輸入錯誤的檢查變量怎麼辦? 在每種情況下,我都必須去找到我包含 throwTest.include 的每個腳本並編輯檢查變量以使其正確,這首先違背了使用 include 的目的。
回复:Throw() inside include/function更新,不知道為什麼我昨晚沒有想到這一點,但提前發送 return() 語句將有效地拋出一個函數。這在其他語言中也很常見。
投擲測試=功能({} , {默認本地} ,
打印( “E” ) ;
返回() ;
打印( “F” ) ;
) ;
投擲測試() ;
打印( “G” ) ;
輸出:
“E” “G”
回复:Throw() inside include/function我不同意您關於上述方法“違背了使用包含的目的”的說法。
包含的代碼可以執行很多很多不同類型的功能,並且可以做很多事情,比如數據清理、轉換等。如果在包含的代碼中發現了一個無效的用例,人們可能想要關閉整個應用程序。因此,需要拋出包含的代碼,然後當執行返回到主代碼時,需要檢測是否已檢測到失敗情況,然後需要拋出主腳本。
回复:Throw() inside include/function雖然這是一個簡單的解決方法,但它確實違背了使用包含的目的。
回复:Throw() inside include/function我相信您可以通過檢查變量簡單地傳遞信息並在主腳本中採取行動來解決這個問題。
名字默認到這裡( 1個) ;
包括( “C:\Users\txjim\Documents\JMP\throwTest.include.jsl” ) ;
如果( 丟它== 1個,扔() ) ;
打印( “D” ) ;
投擲測試=功能( {} ,
{默認本地} ,
打印( “E” ) ;
扔() ;
打印( “F” ) ;
) ;
拋出測試() ;
打印( “G” ) ;
// 這裡是包含文件
打印( “乙” ) ;
丟它= 1個;
扔() ;
打印( “C” ) ;