루아 오류 처리


프로그램 실행 중 오류 처리가 필요합니다. 파일 작업, 데이터 전송 및 웹 서비스 호출 중에 예기치 않은 오류가 발생합니다. 오류 메시지 처리에 주의하지 않으면 정보가 유출되어 프로그램이 실행되지 않습니다.

모든 프로그래밍 언어에는 오류 처리가 필요합니다. 오류 유형은 다음과 같습니다.

  • 구문 오류

  • 실행 오류


구문 오류

구문 오류는 일반적으로 프로그램 구성 요소(예: 연산자, 표현식)를 부적절하게 사용하여 발생합니다. 간단한 예는 다음과 같습니다.

-- 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: 콜백을 기반으로 확장 오류 메시지 구성

>=xpcall(function(i) print(i) error( ' error..') end, function() print(debug.traceback()) end, 33) 33 스택 추적: stdin:1: 기능 중