Close Menu

    Subscribe to Updates

    Get the latest creative news from FooBar about art, design and business.

    What's Hot

    US lawmakers push to block insider bets on government events

    March 26, 2026

    CHART: USDC is growing faster than USDT under Trump

    March 26, 2026

    The 1.x Files: The Stateless Ethereum Tech Tree

    March 26, 2026
    Facebook X (Twitter) Instagram
    Ai Crypto TimesAi Crypto Times
    • Altcoins
      • Bitcoin
      • Coinbase
      • Litecoin
    • Blockchain
    • Crypto
    • Ethereum
    • Lithosphere News Releases
    X (Twitter) Instagram YouTube LinkedIn
    Ai Crypto TimesAi Crypto Times
    Home » Solidity 0.6.x features: try/catch statement

    Solidity 0.6.x features: try/catch statement

    Michael JohnsonBy Michael JohnsonMarch 26, 2026No Comments4 Mins Read
    Facebook Twitter Pinterest LinkedIn Tumblr Reddit Telegram Email
    Share
    Facebook Twitter LinkedIn Pinterest Email



    The try/catch syntax introduced in 0.6.0 is arguably the biggest leap in error handling capabilities in Solidity, since reason strings for revert and require were released in v0.4.22. Both try and catch have been reserved keywords since v0.5.9 and now we can use them to handle failures in external function calls without rolling back the complete transaction (state changes in the called function are still rolled back, but the ones in the calling function are not).

    We are moving one step away from the purist “all-or-nothing” approach in a transaction lifecycle, which falls short of practical behaviour we often want.

    Handling external call failures

    The try/catch statement allows you to react on failed external calls and contract creation calls, so you cannot use it for internal function calls. Note that to wrap a public function call within the same contract with try/catch, it can be made external by calling the function with this..

    The example below demonstrates how try/catch is used in a factory pattern where contract creation might fail. The following CharitySplitter contract requires a mandatory address property _owner in its constructor.

    pragma solidity ^0.6.1;
    
    contract CharitySplitter {
        address public owner;
        constructor (address _owner) public {
            require(_owner != address(0), "no-owner-provided");
            owner = _owner;
        }
    }
    

    There is a factory contract — CharitySplitterFactory which is used to create and manage instances of CharitySplitter. In the factory we can wrap the new CharitySplitter(charityOwner) in a try/catch as a failsafe for when that constructor might fail because of an empty charityOwner being passed.

    pragma solidity ^0.6.1;
    import "./CharitySplitter.sol";
    contract CharitySplitterFactory {
        mapping (address => CharitySplitter) public charitySplitters;
        uint public errorCount;
        event ErrorHandled(string reason);
        event ErrorNotHandled(bytes reason);
        function createCharitySplitter(address charityOwner) public {
            try new CharitySplitter(charityOwner)
                returns (CharitySplitter newCharitySplitter)
            {
                charitySplitters[msg.sender] = newCharitySplitter;
            } catch {
                errorCount++;
            }
        }
    }
    

    Note that with try/catch, only exceptions happening inside the external call itself are caught. Errors inside the expression are not caught, for example if the input parameter for the new CharitySplitter is itself part of an internal call, any errors it raises will not be caught. Sample demonstrating this behaviour is the modified createCharitySplitter function. Here the CharitySplitter constructor input parameter is retrieved dynamically from another function — getCharityOwner. If that function reverts, in this example with “revert-required-for-testing”, that will not be caught in the try/catch statement.

    function createCharitySplitter(address _charityOwner) public {
        try new CharitySplitter(getCharityOwner(_charityOwner, false))
            returns (CharitySplitter newCharitySplitter)
        {
            charitySplitters[msg.sender] = newCharitySplitter;
        } catch (bytes memory reason) {
            ...
        }
    }
    function getCharityOwner(address _charityOwner, bool _toPass)
            internal returns (address) {
        require(_toPass, "revert-required-for-testing");
        return _charityOwner;
    }
    

    Retrieving the error message

    We can further extend the try/catch logic in the createCharitySplitter function to retrieve the error message if one was emitted by a failing revert or require and emit it in an event. There are two ways to achieve this:

    1. Using catch Error(string memory reason)

    function createCharitySplitter(address _charityOwner) public {
        try new CharitySplitter(_charityOwner) returns (CharitySplitter newCharitySplitter)
        {
            charitySplitters[msg.sender] = newCharitySplitter;
        }
        catch Error(string memory reason)
        {
            errorCount++;
            CharitySplitter newCharitySplitter = new
                CharitySplitter(msg.sender);
            charitySplitters[msg.sender] = newCharitySplitter;
            // Emitting the error in event
            emit ErrorHandled(reason);
        }
        catch
        {
            errorCount++;
        }
    }
    

    Which emits the following event on a failed constructor require error:

    CharitySplitterFactory.ErrorHandled(
        reason: 'no-owner-provided' (type: string)
    )
    

    2. Using catch (bytes memory reason)

    function createCharitySplitter(address charityOwner) public {
        try new CharitySplitter(charityOwner)
            returns (CharitySplitter newCharitySplitter)
        {
            charitySplitters[msg.sender] = newCharitySplitter;
        }
        catch (bytes memory reason) {
            errorCount++;
            emit ErrorNotHandled(reason);
        }
    }
    

    Which emits the following event on a failed constructor require error:

    CharitySplitterFactory.ErrorNotHandled(
      reason: hex'08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000116e6f2d6f776e65722d70726f7669646564000000000000000000000000000000' (type: bytes)
    

    The above two methods for retrieving the error string produce a similar result. The difference is that the second method does not ABI-decode the error string. The advantage of the second method is that it is also executed if ABI decoding the error string fails or if no reason was provided.

    Future plans

    There are plans to release support for error types meaning we will be able to declare errors in a similar way to events allowing us to catch different type of errors, for example:

    catch CustomErrorA(uint data1) { … }
    catch CustomErrorB(uint[] memory data2) { … }
    catch {}
    



    Source link

    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Michael Johnson

    Related Posts

    The 1.x Files: The Stateless Ethereum Tech Tree

    March 26, 2026

    eth2 quick update no. 8

    March 26, 2026

    Validated, staking on eth2: #2 – Two ghosts in a trench coat

    March 26, 2026

    Comments are closed.

    Don't Miss

    US lawmakers push to block insider bets on government events

    Crypto March 26, 2026

    US lawmakers have opened a new front in the fight over prediction markets. A bipartisan…

    CHART: USDC is growing faster than USDT under Trump

    March 26, 2026

    The 1.x Files: The Stateless Ethereum Tech Tree

    March 26, 2026

    Bitcoin Depot taps ex MoneyGram chief as CEO during probe

    March 26, 2026
    Stay In Touch
    • Facebook
    • Twitter
    • Pinterest
    • Instagram
    • YouTube
    • Vimeo
    Our Picks

    Burundi joins Eritrea, Sudan, Uganda, Somalia, Ethiopia, Kenya, Zimbabwe, Madagascar, Rwanda, Malawi, Mauritius, Seychelles, Comoros, Djibouti, Democratic Republic of Congo, Egypt, Eswatini, Libya, Tunisia and Zambia, alongside other global partners at…

    March 23, 2026

    Lithosphere Expands Developer Ecosystem with Lithic Toolchain

    March 23, 2026

    Lithic AI Provider Standard Enables Interoperable AI Infrastructure

    March 20, 2026

    LSCL Launches with Pre-Audited AI Modules for Secure Smart Contract Development

    March 19, 2026

    Subscribe to Updates

    Get the latest creative news from SmartMag about art & design.

    Demo
    • Popular
    • Recent
    • Top Reviews

    Pi Network suspends wallet payment requests after scammers drain millions

    January 25, 2026

    FurGPT Strengthens Global Presence Following Multi-Exchange Listings

    January 25, 2026

    Truebit protocol hack exposes DeFi security risks as TRU token collapses

    January 25, 2026

    US lawmakers push to block insider bets on government events

    March 26, 2026

    CHART: USDC is growing faster than USDT under Trump

    March 26, 2026

    The 1.x Files: The Stateless Ethereum Tech Tree

    March 26, 2026
    Latest Galleries
    [latest_gallery cat="all" number="5" type="slider"]
    Latest Reviews
    Demo
    Top Posts

    Lithic Introduces zk-Verifiable AI Execution Standard (LEP100-5)

    March 17, 20261 Views

    KaJ Labs Unveils Ecosystem Alignment Strategy to Strengthen AI and Web3 Integration

    March 14, 20261 Views

    KaJ Labs Unveils Lithic Developer Stack for AI Applications, Games, and Enterprise Systems

    March 14, 20261 Views

    Burundi joins Eritrea, Sudan, Uganda, Somalia, Ethiopia, Kenya, Zimbabwe, Madagascar, Rwanda, Malawi, Mauritius, Seychelles, Comoros, Djibouti, Democratic Republic of Congo, Egypt, Eswatini, Libya, Tunisia and Zambia, alongside other global partners at…

    March 23, 20260 Views
    Don't Miss

    US lawmakers push to block insider bets on government events

    Crypto March 26, 2026

    US lawmakers have opened a new front in the fight over prediction markets. A bipartisan…

    CHART: USDC is growing faster than USDT under Trump

    March 26, 2026

    The 1.x Files: The Stateless Ethereum Tech Tree

    March 26, 2026

    Bitcoin Depot taps ex MoneyGram chief as CEO during probe

    March 26, 2026
    Stay In Touch
    • Facebook
    • Twitter
    • Pinterest
    • Instagram
    • YouTube
    • Vimeo

    Subscribe to Updates

    Get the latest creative news from SmartMag about art & design.

    Demo
    Top Posts

    Centrifuge price explodes as CFG trading goes live on Upbit

    March 15, 20262 Views

    Lithic Introduces zk-Verifiable AI Execution Standard (LEP100-5)

    March 17, 20261 Views

    Trillion Dollar Security – Phase 2

    March 16, 20261 Views

    Protocol Update 002 – Scale Blobs

    March 16, 20261 Views
    Don't Miss

    US lawmakers push to block insider bets on government events

    Crypto March 26, 2026

    US lawmakers have opened a new front in the fight over prediction markets. A bipartisan…

    CHART: USDC is growing faster than USDT under Trump

    March 26, 2026

    The 1.x Files: The Stateless Ethereum Tech Tree

    March 26, 2026

    Bitcoin Depot taps ex MoneyGram chief as CEO during probe

    March 26, 2026
    Stay In Touch
    • Facebook
    • Twitter
    • Pinterest
    • Instagram
    • YouTube
    • Vimeo

    Subscribe to Updates

    Get the latest creative news from SmartMag about art & design.

    X (Twitter) Instagram YouTube LinkedIn
    Our Picks

    US lawmakers push to block insider bets on government events

    March 26, 2026

    CHART: USDC is growing faster than USDT under Trump

    March 26, 2026

    The 1.x Files: The Stateless Ethereum Tech Tree

    March 26, 2026
    Recent Posts
    • US lawmakers push to block insider bets on government events
    • CHART: USDC is growing faster than USDT under Trump
    • The 1.x Files: The Stateless Ethereum Tech Tree
    • Bitcoin Depot taps ex MoneyGram chief as CEO during probe
    • Announcement: 101 Blockchains Recognized as a Leader in the G2 Spring 2026 Reports
    © 2026 - 2026

    Type above and press Enter to search. Press Esc to cancel.