루아 오류 처리
프로그램 실행 중 오류 처리가 필요합니다. 파일 작업, 데이터 전송 및 웹 서비스 호출 중에 예기치 않은 오류가 발생합니다. 오류 메시지 처리에 주의하지 않으면 정보가 유출되어 프로그램이 실행되지 않습니다.
모든 프로그래밍 언어에는 오류 처리가 필요합니다. 오류 유형은 다음과 같습니다.
구문 오류
실행 오류
구문 오류
구문 오류는 일반적으로 프로그램 구성 요소(예: 연산자, 표현식)를 부적절하게 사용하여 발생합니다. 간단한 예는 다음과 같습니다.
-- test.lua 文件 a == 2
위 코드의 실행 결과는 다음과 같습니다.
lua: test.lua:2: syntax error near '=='
보시다시피 위 코드에는 구문 오류가 있습니다. "=" 다음에 하나가 옵니다. two "=" 개수에 차이가 있습니다. 하나의 "="는 할당 표현식이고 두 개의 "="는 비교 연산입니다.
또 다른 예:
for a= 1,10 print(a) end
위 프로그램을 실행하면 다음 오류가 발생합니다.
lua: test2.lua:2: 'do' expected near 'print'
구문 오류는 프로그램 실행 오류보다 간단합니다. 및 구문 오류 예를 들어 위의 예에서는 for 문 아래에 do를 추가하기만 하면 됩니다.
for a= 1,10 do print(a) end
실행 오류
실행 오류 이는 프로그램이 정상적으로 실행될 수 있지만 오류 메시지가 출력된다는 의미입니다. 다음 예에서는 잘못된 매개변수 입력으로 인해 프로그램 실행 중 오류가 발생합니다.
function add(a,b) return a+b end add(10)
다음 코드를 컴파일하고 실행하면 컴파일은 성공할 수 있지만 작업 중에 다음 오류가 발생합니다.
lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value) stack traceback: test2.lua:2: in function 'add' test2.lua:5: in main chunk [C]: ?
다음 오류 메시지는 프로그램에 b 매개변수가 누락되어 발생합니다.
오류 처리
assert와 error라는 두 가지 함수를 사용하여 오류를 처리할 수 있습니다. 예는 다음과 같습니다.
local function add(a,b) assert(type(a) == "number", "a 不是一个数字") assert(type(b) == "number", "b 不是一个数字") return a+b end add(10)
위 프로그램을 실행하면 다음 오류가 발생합니다.
lua: test.lua:3: b 不是一个数字 stack traceback: [C]: in function 'assert' test.lua:3: in local 'add' test.lua:6: in main chunk [C]: in ?
예제에서는 Assert가 첫 번째 매개변수를 먼저 확인하고 문제가 없으면 Assert가 수행합니다. 그렇지 않으면 첫 번째 매개변수로 시작됩니다. 두 매개변수는 오류 메시지로 표시됩니다.
오류 함수
구문 형식:
error (message [, level])
함수: 실행 함수를 종료하고 메시지 내용을 오류 정보로 반환합니다(오류 함수는 절대 반환하지 않음)
일반적으로 오류는 메시지 헤더에 일부 오류 위치 정보를 추가합니다.
레벨 매개변수는 오류가 발생한 위치를 나타냅니다.
레벨=1 [기본값]: 오류 위치 호출(파일 + 줄 번호)
레벨=2: 어떤 함수가 오류 함수를 호출하는지 지적
레벨=0: 오류 위치 정보를 추가하지 않음
pcall 및 xpcall, 디버그
Lua에서 오류를 처리하려면 pcall(보호 호출) 함수를 사용하여 실행해야 하는 코드를 래핑할 수 있습니다.
pcall은 전달될 함수와 후자의 매개변수를 수신하고 실행합니다. 실행 결과는 error 또는 no error이며, 반환 값은 true 또는 false입니다.
구문 형식은 다음과 같습니다
if pcall(function_name, ….) then -- 没有错误 else -- 一些错误 end
간단한 예:
> =pcall(function(i) print(i) end, 33) 33 true > =pcall(function(i) print(i) error('error..') end, 33) 33 false stdin:1: error..<p여기서 반환 값의 논리적 판단에 주의하세요:< p="">
> function f() return false,2 end > if f() then print '1' else print '0' end 0
"보호 모드"에서 pcall을 사용하여 첫 번째 인수로 호출하므로 pcall은 함수 실행 중 오류를 포착할 수 있습니다.
오류가 발생하면 오류가 발생한 위치뿐만 아니라 더 많은 디버깅 정보를 얻고 싶은 경우가 많습니다. 그러나 pcall이 반환되면 호출 스택의 일부가 파괴됩니다.
Lua는 xpcall 함수를 제공합니다. xpcall은 오류 처리 함수인 두 번째 매개변수를 받습니다. 오류가 발생하면 Lua는 unwind를 호출하기 전에 오류 처리 함수를 호출하므로 여기에는 디버그 라이브러리가 사용됩니다. 오류에 대한 추가 정보를 얻는 기능입니다.
디버그 라이브러리는 두 가지 일반적인 오류 처리 기능을 제공합니다.debug.debug: 사용자가 확산 오류의 원인을 찾을 수 있도록 Lua 프롬프트를 제공합니다.
debug.traceback: 콜백을 기반으로 확장 오류 메시지 구성