Lua의 간단한 오류 처리 실례

3374 단어
어제 다른 독립 게임 개발자를 만났어요. 그래서 얘기를 좀 더 나눈 다음에... 책을 읽지 않았어요.(소약: 핑계! 핑계!)오늘은 잘못된 처리에 대해 이야기해 봅시다. 그러나 이것은 앞의 장절일 뿐이기 때문에 책의 내용은 약간 지나친 맛이 있는 것 같습니다.
괜찮아, 간단하면 더 좋아~
1. 적색경보―error
우리는 다음과 같은 오류 정보를 자주 볼 수 있어야 한다.
 
  
[LUA-print] LUA ERROR: [string "src/main.lua"]:108: [string "src/main.lua"]:89: attempt to index global ‘a' (a nil value)

이것은 오류가 발생했을 때 우리에게 주는 힌트입니다. 보통, 이것은 우리의 코드가 계속 정상적으로 실행될 수 없다는 것을 의미합니다.
 
그러나 우리가 이런 오류를 위조할 수 있다는 것을 알고 있습니까? 그렇습니다. 자발적으로 error 함수를 호출하면 이런 정보가 나타납니다.
다음 코드:
 
  
    error(" , , ");

그런 다음 를 실행하여 다음 정보를 출력합니다.
 
  
[LUA-print] LUA ERROR: [string "src/main.lua"]:109: [string "src/main.lua"]:96: , ,

이거 대박이다. 앞으로 누가 기분 나쁘면 코드에 이 말을 넣어라. 예를 들어 프로젝트 시작 전에 넣어라~
 
본론으로 돌아가면 우리가 함수를 호출하기 전에 전달할 매개 변수가 정상인지 아닌지를 판단할 수 있다. 만약에 정상적이지 않으면 우리는 직접 error를 던져서 코드를 쓰기 편리하게 하는 과정에서 문제를 발견할 수 있다.
예를 들어 다음 코드:
 
  
    local name = io.read();
    if name ~= " " then
        error(" , .. , !");
    end

입력한 내용이'멍청한 나무'가 아니라는 것을 발견하면 이상을 톡톡히 던진다.
2. 게으름 피우기―assert
방금 그 판단 오류와 같은 코드는 약간 시끄러운 것 같아서, 우리는 if not then과 같은 코드를 assert로 대체할 수 있다.
예를 들어 위의 코드가 다음과 같이 변경되었습니다.
 
  
    local name = io.read();
    local result = assert(name == " ", " , .. , !");

만약 assert의 첫 번째 파라미터가false가 아니라면 첫 번째 파라미터의 값을 되돌려줍니다.그렇지 않으면 error 함수를 실행하고 오류 정보를 출력합니다. 오류 정보의 내용은 assert의 두 번째 인자입니다.
출력이 똑같아요.
3. 오류 코드 포획―pcall
만약 오류가 발생했을 때, 우리는 코드가 실행을 멈추는 것을 원하지 않고, 긴급 조치를 취하기를 원하지 않는다면, pcall로 오류를 포착할 수 있습니다.다음 코드는 다음과 같습니다.
 
  
    function test()
        print(a[1]);
    end
    if pcall(test) then
        print(" , ");
    else
        print(" , , , , ... , ~");
      
    end

함수 테스트가 실행될 때 틀림없이 오류가 발생할 것입니다. 왜냐하면 a라는 테이블이 존재하지 않기 때문입니다.pcall을 사용하여test 함수를 호출합니다. 만약test가 오류를 보고하지 않으면 pcall는ture를 되돌려줍니다. 그렇지 않으면false를 되돌려줍니다.이 특성을 이용하면 우리는 이상을 포착하여 긴급 처리를 할 수 있다.
코드를 실행하고 출력 결과는 다음과 같습니다.
 
  
[LUA-print] , , , , … , ~
, 。( : ! ?)

pcall은 true 또는 false 이외에 함수에 대한 오류 정보를 다음과 같이 반환합니다.
 
  
    function test()
        print(a[1]);
    end
    local status, err = pcall(test);
    if status then
        print(" , ");
    else
        print(" , , , , ... , ~");
        print(err);
    end

pcall의 첫 번째 반환값은 이전과 같습니다.true 또는false.
두 번째 매개 변수는 테스트 함수에서 던진 오류 정보이고 실행 코드는 다음과 같다.
 
  
[LUA-print] , , , , … , ~
[LUA-print] [string "src/main.lua"]:94: attempt to index global ‘a' (a nil value)

4. 끝
오류 처리에 관해서는 재미있는 것이 없는 것 같으니 이만큼만 쓰세요~

좋은 웹페이지 즐겨찾기