루아 오류 처리
프로그램 실행 오류 처리 예기치 않은 오류가 나타납니다 우리의 파일 작업, 데이터 전송 및 웹 서비스 호출에 필요합니다. 만약 누출 정보에 따라 에러 메시지를 처리에주의하지 않으면, 등등 실행할 수 없다.
모든 프로그래밍 언어는 오류 처리가 필요합니다. 오류 유형은 다음과 같습니다
- 구문 오류
- 런타임 오류
구문 오류
구문 오류는 일반적으로 부적절한 사용으로 인한 (예 : 연산자, 수식 등) 프로그램의 구성 요소에 기인한다. 다음과 같이 간단한 예입니다 :
-- 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 예 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