수색…


pcall 사용

pcall 은 "보호 된 통화"의 약자입니다. 함수에 오류 처리를 추가하는 데 사용됩니다. pcall 은 다른 언어에서 try-catch 와 유사하게 작동합니다. 의 장점 pcall 오류가 호출 기능에서 발생하는 경우 스크립트의 전체 실행이 중단되지 않을 것입니다 pcall . pcall 호출 된 함수 내에서 오류가 발생하면 오류가 발생하고 나머지 코드는 계속 실행됩니다.


통사론:

pcall( f , arg1,···)

반환 값 :

두 값을 반환합니다.

  1. 상태 (부울)
  • 함수가 오류없이 실행 된 경우 true를 반환 합니다 .
  • 함수 내에 에러가 발생하면 false를 반환합니다.
  1. 함수 블록 내에서 오류가 발생한 경우 함수 또는 오류 메시지의 반환 값입니다.

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))


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow