Latest web development tutorials

루아 오류 처리

프로그램 실행 오류 처리 예기치 않은 오류가 나타납니다 우리의 파일 작업, 데이터 전송 및 웹 서비스 호출에 필요합니다. 만약 누출 정보에 따라 에러 메시지를 처리에주의하지 않으면, 등등 실행할 수 없다.

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

  • 구문 오류
  • 런타임 오류

구문 오류

구문 오류는 일반적으로 부적절한 사용으로 인한 (예 : 연산자, 수식 등) 프로그램의 구성 요소에 기인한다. 다음과 같이 간단한 예입니다 :

-- test.lua 文件
a == 2

상기 코드의 결과로서 실행된다 :

lua: test.lua:2: syntax error near '=='

당신이 볼 수 있듯이, 구문 오류가 이상이 있었다,에 "="기호는 두 개의 "="기호 다음에이 다릅니다. A는 "="할당 식 2 개인 "="비교 동작이다.

또 다른 예 :

for a= 1,10
   print(a)
end

위의 프로그램은 다음과 같은 오류가 나타납니다 :

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

구문 오류는 우리가 문에 대한 추가 할 수 있습니다에서와 같이 특정 오류 등 위의 예와 같은 우리가 신속하게 해결할 수 있습니다 문법 실수를 찾을 수없는 프로그램 오류, 실행 오류를 실행하는 것보다 쉽다 :

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]: ?

프로그램이 나 매개 변수가 없기 때문에 다음과 같은 오류 메시지가 발생합니다.


오류 처리

우리는 두 가지 기능을 사용할 수 어설 에러는 에러를 처리하기. 다음 예는 다음과 같다 :

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 ?

그렇지 않으면로 2 번째의 인수가 오류 메시지가 발생 주장하는 예는 아무 문제가있는 경우, 아무것도하지 않는 주장, 첫 번째 검사를 첫 번째 인수를 주장한다.

오차 함수

구문 :

error (message [, level])

: 실행되는 함수를 종료하고, 에러 메시지로서 메시지 내용을 리턴 (오차 함수 리턴하지 않을 것이다)

일반적으로, 오류는 헤드 위치에 에러 메시지에 대한 추가 정보가 될 것이다.

레벨 매개 변수는 잘못 얻을 수있는 위치를 나타냅니다 :

  • 레벨 = 1 [기본값] : 오류 (파일 + 줄 번호)로 전화하려면
  • 레벨 = 2 : 함수 나타내는 오차 함수를 호출
  • 레벨 = 0 : 오류 위치를 추가하지 않습니다

PCALL과 xpcall, 디버그

루아 오류 처리, 당신은 실행되는 코드를 래핑하는 기능 PCALL (보호 호출)를 사용할 수 있습니다.

결과를 함수를 수신 PCALL 당신은 후자의 매개 변수를 전달하려는 및 실행 : 오류, 에러가 또는 참 또는 거짓의 반환 값이 ERRORINFO.

다음 구문은

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..
> function f() return false,2 end
> if f() then print '1' else print '0' end
0

는 "보호 모드"에서 PCALL 따라서 PCALL 캡처 기능이 오류를 수행 할 수 있습니다, 첫 번째 인수를 호출합니다.

오류가 발생 일반적으로 할 때, 더 디버깅 정보와 끝까지 기대하고있다,뿐만 아니라 오류가 발생한 위치. 그러나 PCALL 반품, 그것은 통화 ZHAN의 내용의 일부를 파괴 하였다.

오류가 발생하는 오류 처리기, 루아 오류 처리기가 다음 디버그 라이브러리에이 기능을 사용할 수 있습니다 참조 (긴장)에 ZHAN 쇼를 호출하기 전에 호출됩니다 - 루아는 두 번째 매개 변수를 수신 xpcall, xpcall 기능을 제공합니다 오류에 대한 자세한 정보를 얻을 수있다.

디버그 라이브러리는 두 개의 일반 오류 처리기를 제공합니다 :

  • debug.debug : 루아 사용자가 잘못된 이유를 확산 할 수 있도록 프롬프트를 제공
  • debug.traceback : ZHAN 호출에 따르면 확장 된 오류 메시지를 구축하기
> = Xpcall (기능 (ⅰ) 인쇄 (내가) 오류 ( '오류 ..') 끝, 기능 () 인쇄 (debug.traceback ()) 끝, 33) 33 스택 추적 : 표준 입력 : 1 : 함수 [C] : 표준 입력 '오류'기능에 : 1 : 함수 [C] : 함수 'xpcall'표준 입력 : 1 : 주요 덩어리 [C] :? 거짓 전무에서의

xpcall 예 2 :

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