실습: 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; // 실패 흡수
}
}
}해야 할 일:
Caller컨트랙트를 선언하세요.lastValue라는public uint256상태 변수와failed라는public bool상태 변수를 두세요.Succeeded(uint256 value)이벤트와Caught()이벤트를 선언하세요.run(IService target)함수를 구현하세요.try target.work() returns (uint256 v)가 성공하면lastValue = v,failed = false,Succeeded(v)이벤트 발생.catch블록에서는failed = true로 두고Caught()이벤트를 발생시키세요.
try 뒤에는 반드시 외부 호출이나 컨트랙트 생성이 와야 합니다. 인터페이스 IService 는 이미
주어져 있습니다.
완성 후 Run 을 눌러 컴파일하고 모든 조건을 통과하는지 확인하세요.