Solidity 솔리디티 강좌 28강 : 에러 핸들러 - try/catch (2)

flowing1ife·2023년 8월 1일
0

[ Solidity 깨부수기 ]

목록 보기
28/29
post-thumbnail

Solidity 솔리디티 강좌 28강 : 에러 핸들러 - try/catch (2)
이번엔 solidity의 에러 핸들러, try/catch를 더 깊이 탐구해보도록 하자.


try / catch (2)

📌 Solidity

1. 외부 스마트 컨트랙을 생성할 때

// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;

//외부 스마트 컨트랙을 생성할 때 
contract character{
    string private name;
    uint256 private power;

    constructor(string memory _name, uint256 _power){
        name = _name;
        power = _power;
    }
}

contract runner{
    event catchOnly(string _name, string _err);
    function playTryCatch(string memory _name, uint256 _power)public returns(bool successOrFail){
        try new character(_name, _power){
            return(true);
        }
        catch{
            emit catchOnly("catch", "ErrorS!!");
            return(false);
        }
    }
}

다음과 같이 코드를 작성하였다. 결과를 보며 함께 분석해보자.

👉 결과

namekim, power8을 입력하였더니 character 컨트랙트가 잘 생성된 것을 확인할 수 있다.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;

//외부 스마트 컨트랙을 생성할 때 
contract character{
    string private name;
    uint256 private power;

    constructor(string memory _name, uint256 _power){
        revert("error");
        name = _name;
        power = _power;
    }
}

contract runner{
    event catchOnly(string _name, string _err);
    function playTryCatch(string memory _name, uint256 _power)public returns(bool successOrFail){
        try new character(_name, _power){
            return(true);
        }
        catch{
            emit catchOnly("catch", "ErrorS!!");
            return(false);
        }
    }
}

이번엔 character 컨트랙트를 생성하면 무조건 에러가 나도록 코드를 작성해 보았다.

👉 결과

다음과 같이 에러를 출력해주지만 프로그램을 종료하지 않는 것을 확인할 수 있다.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;

//외부 스마트 컨트랙을 생성할 때 
contract character{
    string private name;
    uint256 private power;

    constructor(string memory _name, uint256 _power){
        name = _name;
        power = _power;
    }
}

contract runner{
    event catchOnly(string _name, string _err);
    function playTryCatch(string memory _name, uint256 _power)public returns(bool successOrFail){
        try new character(_name, _power){
            revert("errors in the try/catch block");
            return(true);
        }
        catch{
            emit catchOnly("catch", "ErrorS!!");
            return(false);
        }
    }
}

이번엔 try문 내에서 무조건 에러가 나도록 코드를 작성해 보았다.

👉 결과

이처럼 try문 안에서 revert를 하면 try 문 내에서 바로 멈추는 것을 확인할 수 있다.

2. 스마트 컨트랙트 내에서 함수를 부를 때

// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;

//외부 스마트 컨트랙을 생성할 때 
contract character{
    string private name;
    uint256 private power;

    constructor(string memory _name, uint256 _power){
        name = _name;
        power = _power;
    }
}

contract runner{
    event catchOnly(string _name, string _err);
    function playTryCatch(string memory _name, uint256 _power)public returns(bool successOrFail){
        try new character(_name, _power){
            revert("errors in the try/catch block");
            return(true);
        }
        catch{
            emit catchOnly("catch", "ErrorS!!");
            return(false);
        }
    }
}

//스마트 컨트랙 내에서 함수를 부를 때
contract runner2{
    function simple() public returns (uint256){
        return 4;
    }
    event catchOnly(string _name, string _err);

    function playTryCatch()public returns(uint256, bool){
        try this.simple() returns (uint256 _value){
            return(_value, true);
        }
        catch{
            emit catchOnly("catch", "ErrorS!!");
            return(0, false);
        }
    }
}

이번엔 스마트 컨트랙트 내에서 함수를 불러 보았다.

👉 결과

이처럼 스마트 컨트랙트 내에서 함수를 부를 때에도 try/catch 문을 사용할 수 있다.


출처 및 참고 자료

profile
👩🏻‍💻 Backend Engineer, Contract Developer

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

이런 유용한 정보를 나눠주셔서 감사합니다.

답글 달기