2017-06-27 58 views
0

這是我簡單的合同如何抓住以太坊合同異常?

contract Test { 
    /* This creates an array with all balances */ 
    mapping (address => uint256) public balanceOf; 

    /* Initializes contract with initial supply tokens to the creator of the contract */ 
    function Test(
     uint256 initialSupply 
     ) { 
     balanceOf[msg.sender] = initialSupply;    // Give the creator all initial tokens 
    } 

    /* Send coins */ 
    function transfer(address _to, uint256 _value) { 
     if (balanceOf[msg.sender] < _value) throw;   // Check if the sender has enough 
     if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows 
     balanceOf[msg.sender] -= _value;      // Subtract from the sender 
     balanceOf[_to] += _value;       // Add the same to the recipient 
    } 

function gettokenBalance(address to)constant returns (uint256){ 
      return balanceOf[to]; 
     } 
} 

當我更令牌傳遞比INTIAL供應到另一個帳戶功能transfer應該拋出異常。

我該如何處理這個異常,瞭解交易不能完整地填寫正在使用web3j和像

Test test = Test.load(contractObj.getContractAddress(), web3j, credentials, gasprice,gaslimit); 

TransactionReceipt balanceOf = test.transfer(new Address(address), transferBalance).get(); 

回答

0

調用函數傳遞我從來沒有使用web3js,但你可以嘗試使用try-catch代碼:

try{ 
    Test test = Test.load(contractObj.getContractAddress(), web3j, credentials, gasprice,gaslimit); 

    TransactionReceipt balanceOf = test.transfer(new Address(address), transferBalance).get(); 
} catch (Exception e){ 
    // log you exception 
} 
+0

我已經試過這個,但沒有什麼異常來了......! –

0

我該如何處理這個異常,瞭解交易無法完成

Solidity中有一個例外(throw沒有參數),它是「缺氣」的。所以你的「錯誤」交易完成,但它耗盡了天然氣。如果您知道交易散列,您可以檢查gasLimitgasUsed。如果他們是平等的,你的交易可能*用完了。查看更多信息here

*鑑於您提供的氣體超過了「正確」交易所需的量。

+0

謝謝@jeff,但我已經解決了這個問題,而不是尋找例外情況,我先檢查了賬戶的餘額,是否有足夠的資金或比交易沒有足夠的資金。 –

+0

在這種情況下,即使沒有發送交易,大多數交易簽名庫也會給你一個「資金不足」的錯誤。但是,是的,這是一個重要的檢查。我很高興你的問題解決了! – jeff

+0

是的,實際上我在將餘額轉移到另一個帳戶之前檢查帳戶餘額。 –