블록체인 학습
0 XP

try / catch 기초

지금까지는 잘못된 상황에서 거래를 되돌리는 방법을 배웠습니다. 그런데 반대인 경우도 있습니다. 다른 컨트랙트를 호출했는데 그쪽이 실패했을 때, 내 거래는 살린 채 그 실패만 따로 처리하고 싶은 상황입니다.

try / catch 가 이럴 때 쓰는 도구입니다. 다만 아무 데나 붙일 수는 없고, 쓸 수 있는 자리가 정해져 있습니다.

try / catch 를 쓸 수 있는 자리

try / catch 는 외부 컨트랙트 호출 과 컨트랙트 생성(new) 에만 사용할 수 있습니다. 같은 컨트랙트 안의 내부 함수 호출이나 일반 연산에는 쓸 수 없습니다. 따라서 try 뒤에는 반드시 외부 호출이나 new 표현식이 와야 합니다. 자기 자신을 this.someFunction() 처럼 외부 호출로 부르는 우회 방법도 있지만, 그만큼 가스가 더 듭니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
interface ICounter {
    function increment() external returns (uint256);
}
 
contract Caller {
    event Result(uint256 value);
    event Failed(string reason);
 
    function callIncrement(ICounter target) public {
        try target.increment() returns (uint256 newValue) {
            emit Result(newValue);
        } catch {
            emit Failed("external call failed");
        }
    }
}

동작 방식

  • try ... returns (...): 외부 호출이 성공하면 반환값을 받아 이어지는 정상 블록을 실행합니다.
  • catch { ... }: 외부 호출이 되돌려지면(revert) 이 블록이 실행되어, 거래 전체를 살리고 대안을 처리합니다.

외부 호출이 실패해도 내 거래까지 무너지지 않도록 격리하는 것이 try / catch 의 역할입니다. 가격 오라클이 잠시 멈췄거나 신뢰할 수 없는 외부 컨트랙트를 호출할 때 특히 쓸모가 있습니다.

catch 가 없으면 외부 호출 실패가 그대로 전파되어 거래 전체가 되돌려집니다. 실패를 흡수하려면 반드시 catch 블록을 두세요.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.