Solidity 솔리디티 강좌 28강 : 에러 핸들러 - try/catch (2)
이번엔 solidity의 에러 핸들러, try/catch를 더 깊이 탐구해보도록 하자.
// 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);
}
}
}
다음과 같이 코드를 작성하였다. 결과를 보며 함께 분석해보자.
👉 결과
name
에 kim
, power
에 8
을 입력하였더니 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 문 내에서 바로 멈추는 것을 확인할 수 있다.
// 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 문을 사용할 수 있다.
출처 및 참고 자료
이런 유용한 정보를 나눠주셔서 감사합니다.