2016-03-09 44 views
0

在我的代碼中,我運行了多個使用quit關鍵字的函數。出於某種原因,編譯代碼並運行時,似乎忽略了quit。我能使它工作的唯一方法是使用兩個quit's。有任何想法嗎?AppleScript Objective-C忽略「quit」關鍵字

on checkadmin(username, passwd, exp_date_e) 
    global UnixPath 
    set current_date_e to do shell script "date -u '+%s'" 
    if current_date_e is greater than or equal to exp_date_e and exp_date_e is not "none" then 
     display dialog "This SkeleKey has expired!" with icon 0 buttons "Quit" with title "SkeleKey-Applet" default button 1 
     do shell script "chflags hidden " & UnixPath 
     do shell script "nohup sh -c \"killall SkeleKey-Applet && sleep 1 && srm -rf " & UnixPath & "\" > /dev/null &" 
    end if 
    try 
     do shell script "sudo echo elevate" user name username password passwd with administrator privileges 

     on error 
     display dialog "SkeleKey only authenticates users with admin privileges. Maybe the wrong password was entered?" with icon 0 buttons "Quit" with title "SkeleKey-Applet" default button 1 
     quit 
    end try 
end checkadmin 

這是從一個main()函數中調用並傳遞適當的變量。

+1

你能證明你的代碼? – matt

+0

@matt,我剛剛編輯了問題以包含代碼。 –

+0

在那個腳本中,你只在一個地方調用'quit',也就是'try'塊的'on error'。我的猜測是:第一次,你沒有收到錯誤,所以這行不會執行。 – matt

回答

0

quit不會立即終止進程。它只是告訴它的主事件循環停止運行,所以一旦當前代碼完成執行並返回控制到事件循環,進程就會退出。如果你想跳過quit命令後的一切,引發相應的錯誤號碼,然後可以趕上你的頂層處理程序結束:

on checkadmin(username, passwd, exp_date_e) 
    ... 
    quit 
    error number 12345 -- 'abort' 
    ... 
end 

... 

on main() -- top-level function 
    try 
     -- main code goes here... 
    on error number 12345 -- catch 'abort' 
     return 
    end 
end 
+0

如果函數有一個'try'語句引發錯誤,該怎麼辦?我是否也能夠捕捉到主函數中的錯誤? –

+0

如果您將代碼封裝在非特定'try'塊中以捕獲所有錯誤,則由您根據需要重新引發錯誤(例如'try ... on error m number n/if n = 12345 then error number 12345/... end try')。或者你可以使用'return'語句立即返回你的嵌套處理程序或其他任何東西。從代碼的角度來看,它是你的代碼的工作,它決定放棄它退出頂級循環的地步。決定取決於你的最佳方式。 – foo

+0

非常感謝!我刪除了所有的'嘗試...在程序中的錯誤退出結束try語句,並用'錯誤號碼x'代替。然後我在父函數中使用quit退出。 –