2013-07-26 66 views

回答

3

在Lua中,錯誤由pcall函數處理。你可以換require它:

local requireAllDependenciesCallback = function() 
    testModul = require 'test'; 
    -- Other requires. 
end; 

if pcall(requireAllDependenciesCallback) then 
    print('included'); 
else 
    print('failed'); 
end 

Demo

注:pcall真的很貴,不應該積極使用。確保,你真的需要靜音require失敗。

+0

感謝PLB,這是有效的。當你說它不應該被主動使用時,純粹是從性能角度還是其他問題? – MarkNS

+0

@ MarkNuttall-Smith僅限演出。如果你決定爲此使用'pcall'。我會建議創建一些函數來處理所有需要避免太多'pcall's。例如:'local requireFiles = function() - 在這裏需要。結束;'並將其傳遞給'pcall'。 – Leri

+0

實際上我並不關心性能,因爲它只是在應用程序啓動期間,我會這樣做。我希望能夠在用戶特定的目錄或共享位置中找到依賴關係。再次感謝。 – MarkNS

6

這是基本用法

if pcall(require, 'test') then 
    -- done but ... 
    -- In lua 5.2 you can not access to loaded module. 
else 
    -- not found 
end 

但由於Lua的5.2它已被棄用設置全局變量時加載庫從需要你應該使用返回的值。 而只有使用PCALL您需要:

local ok, mod = pcall(require, "test") 
-- `mod` has returned value or error 
-- so you can not just test `if mod then` 
if not ok then mod = nil end 
-- now you can test mod 
if mod then 
    -- done 
end 

我喜歡這個功能

local function prequire(m) 
    local ok, err = pcall(require, m) 
    if not ok then return nil, err end 
    return err 
end 

-- usage 
local mod = prequire("test") 
if mod then 
    -- done 
end 
+0

最後一個真的是_sweet_。語言本身應該是這樣的。我不喜歡的是每個'prerequire'都會調用'pcall'。 – Leri

+1

我不認爲這是個大問題。 cfunction'pcall'調用cfunction'require'。 – moteus

+0

我也想在標準庫中看到這個功能。也作爲允許從列表中加載一個庫的函數('bit = vrequire(「bit32」,「bit」)')。 – moteus

1

而不是使用pcall,你在加載器列表的末尾添加可以在自己的裝載機,並讓這個你的loader不會失敗,而是返回一個特殊的值,比如一個字符串。然後,您可以正常使用require並只檢查其返回值。 (裝載機現在在5.2中稱爲搜索者。)

+0

但這是影響到所有模塊,這可能是一個很大的驚喜,即'需要'返回無效值。 – moteus