블록체인 학습
0 XP

실습: try / catch 로 외부 호출 감싸기

외부 컨트랙트 호출이 실패해도 거래 전체가 멈추지 않도록, try / catch 로 감싸 결과를 기록하는 컨트랙트를 완성합니다.

다른 컨트랙트를 그냥 호출했다가 그쪽이 revert 하면, 그 실패가 그대로 전파되어 내 거래까지 되돌려집니다. try / catch 로 외부 호출을 감싸면 실패를 잡아 거래를 살리고, 성공/실패를 상태나 이벤트로 기록할 수 있습니다. try / catch 는 외부 호출과 컨트랙트 생성에만 쓸 수 있다는 점을 기억하세요.

떠올릴 패턴

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
interface IService {
    function work() external returns (uint256);
}
 
contract Example {
    uint256 public value;
 
    function run(IService target) public {
        try target.work() returns (uint256 v) {
            value = v;           // 성공 처리
        } catch {
            value = 0;           // 실패 흡수
        }
    }
}

해야 할 일:

  1. Caller 컨트랙트를 선언하세요.
  2. lastValue 라는 public uint256 상태 변수와 failed 라는 public bool 상태 변수를 두세요.
  3. Succeeded(uint256 value) 이벤트와 Caught() 이벤트를 선언하세요.
  4. run(IService target) 함수를 구현하세요.
    • try target.work() returns (uint256 v) 가 성공하면 lastValue = v, failed = false, Succeeded(v) 이벤트 발생.
    • catch 블록에서는 failed = true 로 두고 Caught() 이벤트를 발생시키세요.

try 뒤에는 반드시 외부 호출이나 컨트랙트 생성이 와야 합니다. 인터페이스 IService 는 이미 주어져 있습니다.

완성 후 Run 을 눌러 컴파일하고 모든 조건을 통과하는지 확인하세요.

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

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