2013-10-10 12 views
5

Czy można zastąpić poniższy kod czymś, co nie korzysta z wyjątków? Uchwyt x jest dostarczonym uchwytem. Chcę przetestować go pod kątem poprawności (posiadającej aktualny kod do obsługi uchwytu) przed użyciem.Czy można przetestować uchwyt funkcji bez bloku try?

x = @notreallyafunction; 
try 
    x(); 
catch 
    disp('Sorry function does not exist.'); 
end 

Odpowiedz

8

Aby przetestować działanie obsługuje takich jak badania przesiewowe się fałszywy [email protected] w swoim pytaniu, można użyć komendy functions sprawdzić uchwyt i uzyskać nazwy odwołuje się funkcja, rodzaj (proste, zagnieżdżone, przeciążony, anonimowy itp.) oraz lokalizację, jeśli jest zdefiniowana w pliku.

>> x = @notreallyafunction; 
>> functions(x) 
ans = 
    function: 'notreallyafunction' 
     type: 'simple' 
     file: '' 
>> x = @(y) y; 
>> functions(x) 
ans = 
    function: '@(y)y' 
     type: 'anonymous' 
     file: '' 
    workspace: {[1x1 struct]} 
>> 

Wyjście functions na uchwycie do wbudowanego polecenia (np [email protected]) wygląda jak sfałszowaną uchwytu funkcyjnych (type jest 'simple'). Następnym krokiem jest sprawdzenie funkcję o nazwie istnienia:

>> x = @round; 
>> fx = functions(x) 
fx = 
    function: 'round' 
     type: 'simple' 
     file: '' 
>> exist(fx.function) 
ans = 
    5 
>> x = @notreallyafunction; 
>> fx = functions(x) 
fx = 
    function: 'notreallyafunction' 
     type: 'simple' 
     file: '' 
>> exist(fx.function) 
ans = 
    0 

Jednak trzeba radzić sobie z funkcji anonimowych ponieważ nie testu egzystencji:

>> x = @(y) y; 
>> fx = functions(x) 
>> exist(fx.function) 
ans = 
    0 

rozwiązaniem jest najpierw sprawdzić type. Jeśli type jest 'anonymous', to test przechodzi. Jeśli numer type to , możesz polegać na exist, aby sprawdzić ważność funkcji. Podsumowując, można utworzyć taką funkcję:

% isvalidhandle.m Test function handle for a validity. 
% For example, 
%  h = @sum; isvalidhandle(h) % returns true for simple builtin 
%  h = @fake; isvalidhandle(h) % returns false for fake simple 
%  h = @isvalidhandle; isvalidhandle(h) % returns true for file-based 
%  h = @(x)x; isvalidhandle(h) % returns true for anonymous function 
%  h = 'round'; isvalidhandle(h) % returns true for real function name 
% Notes: The logic is configured to be readable, not compact. 
%   If a string refers to an anonymous fnc, it will fail, use handles. 
function isvalid = isvalidhandle(h) 

if ~(isa(h,'function_handle') || ischar(h)), 
    isvalid = false; 
    return; 
end 

if ischar(h) 
    if any(exist(h) == [2 3 5 6]), 
     isvalid = true; 
     return; 
    else 
     isvalid = false; 
     return; 
    end 
end 

fh = functions(h); 

if strcmpi(fh.type,'anonymous'), 
    isvalid = true; 
    return; 
end 

if any(exist(fh.function) == [2 3 5 6]) 
    isvalid = true; 
else 
    isvalid = false; 
end 
+0

Nie, jest to niepoprawne. Zwraca true. Sprawdziłem, czy funkcja jest *, ale nie znalazłem nic przydatnego. – Andrej

+0

Nowa odpowiedź. Przegapiłem punkt za pierwszym razem. – chappjc

+0

Hmm, nadal nie działa ... y = suma @; funkcje (x) zwraca ten sam wynik, co funkcje (y) ... nie można rozróżnić – Andrej

Powiązane problemy