수색…
pcall 사용
pcall
은 "보호 된 통화"의 약자입니다. 함수에 오류 처리를 추가하는 데 사용됩니다. pcall
은 다른 언어에서 try-catch
와 유사하게 작동합니다. 의 장점 pcall
오류가 호출 기능에서 발생하는 경우 스크립트의 전체 실행이 중단되지 않을 것입니다 pcall
. pcall
호출 된 함수 내에서 오류가 발생하면 오류가 발생하고 나머지 코드는 계속 실행됩니다.
통사론:
pcall( f , arg1,···)
반환 값 :
두 값을 반환합니다.
- 상태 (부울)
- 함수가 오류없이 실행 된 경우 true를 반환 합니다 .
- 함수 내에 에러가 발생하면 false를 반환합니다.
- 함수 블록 내에서 오류가 발생한 경우 함수 또는 오류 메시지의 반환 값입니다.
pcall은 다양한 경우에 사용될 수 있지만 일반적으로 pcall은 함수에 주어진 함수에서 오류를 포착하는 것입니다. 예를 들어이 함수가 있다고 가정 해 보겠습니다.
local function executeFunction(funcArg, times) then
for i = 1, times do
local ran, errorMsg = pcall( funcArg )
if not ran then
error("Function errored on run " .. tostring(i) .. "\n" .. errorMsg)
end
end
end
해당 함수가 실행 3에서 오류가 발생하면 오류 메시지는 사용자의 함수에서 오지는 않지만 사용자의 함수에 제공된 함수에서 발생한다는 것을 알립니다. 또한이 점을 고려하여 멋진 BSoD를 사용자에게 알릴 수 있습니다. 그러나이 기능을 구현하는 응용 프로그램에 따라 다르므로 API는이를 수행하지 않을 가능성이 높습니다.
예 A - pcall없이 실행
function square(a)
return a * "a" --This will stop the execution of the code and throws an error, because of the attempt to perform arithmetic on a string value
end
square(10);
print ("Hello World") -- This is not being executed because the script was interrupted due to the error
예제 B - pcall로 실행
function square(a)
return a * "a"
end
local status, retval = pcall(square,10);
print ("Status: ", status) -- will print "false" because an error was thrown.
print ("Return Value: ", retval) -- will print "input:2: attempt to perform arithmetic on a string value"
print ("Hello World") -- Prints "Hello World"
예 - 완벽한 코드 실행
function square(a)
return a * a
end
local status, retval = pcall(square,10);
print ("Status: ", status) -- will print "true" because no errors were thrown
print ("Return Value: ", retval) -- will print "100"
print ("Hello World") -- Prints "Hello World"
루아에서 오류 처리하기
다음 함수가 있다고 가정합니다.
function foo(tab)
return tab.a
end -- Script execution errors out w/ a stacktrace when tab is not a table
조금 개선하자.
function foo(tab)
if type(tab) ~= "table" then
error("Argument 1 is not a table!", 2)
end
return tab.a
end -- This gives us more information, but script will still error out
오류가 발생하더라도 함수가 프로그램을 중단시키지 않도록하려면 다음을 수행하는 것이 루아의 표준입니다 :
function foo(tab)
if type(tab) ~= "table" then return nil, "Argument 1 is not a table!" end
return tab.a
end -- This never crashes the program, but simply returns nil and an error message
이제 우리는 다음과 같은 기능을 수행합니다.
if foo(20) then print(foo(20)) end -- prints nothing
result, error = foo(20)
if result then print(result) else log(error) end
그리고 만약 우리가 뭔가 잘못되면 프로그램이 충돌하기를 원한다면, 우리는 여전히 이것을 할 수 있습니다 :
result, error = foo(20)
if not result then error(error) end
다행히도 우리는 매번 그 모든 것을 쓸 필요조차 없습니다. 루아는 정확히 이것을하는 함수를 가지고있다.
result = assert(foo(20))