Lua-오류 처리

오류 처리의 필요성

실제 작업에서는 종종 파일 작업, 데이터베이스 트랜잭션 및 웹 서비스 호출을 포함하는 복잡한 작업을 사용해야하므로 오류 처리는 매우 중요합니다.

모든 프로그래밍에는 항상 오류 처리에 대한 요구 사항이 있습니다. 오류는 다음을 포함하는 두 가지 유형이 될 수 있습니다.

  • 구문 오류
  • 런타임 오류

구문 오류

연산자 및 표현식과 같은 다양한 프로그램 구성 요소를 부적절하게 사용하면 구문 오류가 발생합니다. 구문 오류에 대한 간단한 예가 아래에 나와 있습니다.

a == 2

아시다시피 단일 "같음"과 이중 "같음"사용에는 차이가 있습니다. 다른 것 대신 하나를 사용하면 오류가 발생할 수 있습니다. 하나의 "같음"은 할당을 나타내고 이중 "같음"은 비교를 나타냅니다. 마찬가지로, 우리는 미리 정의 된 구현 방식을 가진 표현식과 함수를 가지고 있습니다.

구문 오류의 또 다른 예는 다음과 같습니다.

for a= 1,10
   print(a)
end

위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.

lua: test2.lua:2: 'do' expected near 'print'

Lua 인터프리터가 런타임 오류의 경우보다 오류를 더 명확하게 찾기 때문에 구문 오류는 런타임 오류보다 처리하기가 훨씬 쉽습니다. 위의 오류를 통해 Lua 구조에 따라 print 문 앞에 do 문 을 추가 해야 한다는 것을 쉽게 알 수 있습니다 .

런타임 오류

런타임 오류의 경우 프로그램은 성공적으로 실행되지만 입력 오류 또는 잘못된 함수 처리로 인해 런타임 오류가 발생할 수 있습니다. 런타임 오류를 보여주는 간단한 예가 아래에 나와 있습니다.

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 매개 변수가 예상되며 여기서는 nil이고 오류가 발생합니다.

Assert 및 오류 함수

오류를 처리하기 위해 종종 두 가지 기능을 사용합니다. asserterror. 간단한 예가 아래에 나와 있습니다.

local function add(a,b)
   assert(type(a) == "number", "a is not a number")
   assert(type(b) == "number", "b is not a number")
   return a+b
end

add(10)

위의 프로그램을 실행하면 다음과 같은 오류가 출력됩니다.

lua: test2.lua:3: b is not a number
stack traceback:
	[C]: in function 'assert'
	test2.lua:3: in function 'add'
	test2.lua:6: in main chunk
	[C]: ?

그만큼 error (message [, level])마지막으로 호출 된 보호 된 함수를 종료하고 오류 메시지로 메시지를 반환합니다. 이 함수 오류는 반환되지 않습니다. 일반적으로 오류는 메시지 시작 부분에 오류 위치에 대한 정보를 추가합니다. level 인수는 오류 위치를 얻는 방법을 지정합니다. 레벨 1 (기본값)에서 오류 위치는 오류 함수가 호출 된 위치입니다. 레벨 2는 오류를 호출 한 함수가 호출 된 위치를 오류를 가리 킵니다. 등등. 레벨 0을 전달하면 메시지에 오류 위치 정보가 추가되지 않습니다.

pcall 및 xpcall

Lua 프로그래밍에서 이러한 오류를 발생시키고 오류를 처리하지 않으려면 pcall 또는 xpcall 함수를 사용해야합니다.

그만큼 pcall (f, arg1, ...)함수는 보호 모드에서 요청 된 함수를 호출합니다. 함수 f에서 오류가 발생하면 오류가 발생하지 않습니다. 오류 상태 만 반환합니다. pcall을 사용한 간단한 예가 아래에 나와 있습니다.

function myfunction ()
   n = n/nil
end

if pcall(myfunction) then
   print("Success")
else
	print("Failure")
end

위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.

Failure

그만큼 xpcall (f, err)함수는 요청 된 함수를 호출하고 오류 처리기를 설정합니다. f 내부의 오류는 전파되지 않습니다. 대신 xpcall은 오류를 포착하고 원래 오류 개체와 함께 err 함수를 호출하고 상태 코드를 반환합니다.

xpcall에 대한 간단한 예가 아래에 나와 있습니다.

function myfunction ()
   n = n/nil
end

function myerrorhandler( err )
   print( "ERROR:", err )
end

status = xpcall( myfunction, myerrorhandler )
print( status)

위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.

ERROR:	test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false

프로그래머로서 작성하는 프로그램에서 적절한 오류 처리를 처리하는 것이 가장 중요합니다. 오류 처리를 사용하면 프로그램 사용자를 방해하지 않고 경계 조건을 넘어서는 예기치 않은 조건을 처리 할 수 ​​있습니다.