{"id":18371,"date":"2026-03-17T04:28:27","date_gmt":"2026-03-17T04:28:27","guid":{"rendered":"https:\/\/cryptoted.net\/index.php\/2026\/03\/17\/solidity-0-6-x-features-try-catch-statement\/"},"modified":"2026-03-17T04:28:27","modified_gmt":"2026-03-17T04:28:27","slug":"solidity-0-6-x-features-try-catch-statement","status":"publish","type":"post","link":"https:\/\/cryptoted.net\/index.php\/2026\/03\/17\/solidity-0-6-x-features-try-catch-statement\/","title":{"rendered":"Solidity 0.6.x features: try\/catch statement"},"content":{"rendered":"<p> <br \/>\n<br \/><img decoding=\"async\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/solidity-logo.svg\" \/><\/p>\n<div id=\"\">\n<p class=\"chakra-text css-gi02ar\">The <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/solidity.readthedocs.io\/en\/latest\/control-structures.html#try-catch\">try\/catch syntax introduced in 0.6.0<\/a> is arguably the biggest leap in error handling capabilities in Solidity, since reason strings for <span class=\"chakra-text css-ons8vw\">revert<\/span> and <span class=\"chakra-text css-ons8vw\">require<\/span> were released in v0.4.22. Both <span class=\"chakra-text css-ons8vw\">try<\/span> and <span class=\"chakra-text css-ons8vw\">catch<\/span> have been reserved keywords <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/solidity.readthedocs.io\/en\/v0.5.9\/miscellaneous.html#reserved-keywords\">since v0.5.9<\/a> and now we can use them to handle failures in <span class=\"chakra-text css-ons8vw\">external<\/span> 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).<\/p>\n<p class=\"chakra-text css-gi02ar\">We are moving one step away from the purist &#8220;all-or-nothing&#8221; approach in a transaction lifecycle, which falls short of practical behaviour we often want.<\/p>\n<h2 class=\"chakra-heading group css-1kpzc4q\" id=\"handling-external-call-failures\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"handling external call failures permalink\" href=\"#handling-external-call-failures\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Handling external call failures<\/h2>\n<p class=\"chakra-text css-gi02ar\">The try\/catch statement allows you to react on failed <em class=\"chakra-text css-0\">external<\/em> calls and <em class=\"chakra-text css-0\">contract creation<\/em> calls, so you cannot use it for <em class=\"chakra-text css-0\">internal<\/em> 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 <span class=\"chakra-text css-ons8vw\">this.<\/span>.<\/p>\n<p class=\"chakra-text css-gi02ar\">The example below demonstrates how try\/catch is used in a factory pattern where contract creation might fail. The following <span class=\"chakra-text css-ons8vw\">CharitySplitter<\/span> contract requires a mandatory address property <span class=\"chakra-text css-ons8vw\">_owner<\/span> in its constructor.<\/p>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-bash\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span>pragma solidity ^0.6.1<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span>\n<span>contract CharitySplitter <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>    address public owner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    constructor <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>address _owner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> public <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>        require<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>_owner <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">!=<\/span><span> address<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span class=\"token\" style=\"color:rgb(247, 140, 108)\">0<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>, <\/span><span class=\"token\" style=\"color:rgb(173, 219, 103)\">\"no-owner-provided\"<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>        owner <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<\/span><span> _owner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<p class=\"chakra-text css-gi02ar\">There is a factory contract \u2014 <span class=\"chakra-text css-ons8vw\">CharitySplitterFactory<\/span> which is used to create and manage instances of <span class=\"chakra-text css-ons8vw\">CharitySplitter<\/span>. In the factory we can wrap the <span class=\"chakra-text css-ons8vw\">new CharitySplitter(charityOwner)<\/span> in a try\/catch as a failsafe for when that constructor might fail because of an empty <span class=\"chakra-text css-ons8vw\">charityOwner<\/span> being passed.<\/p>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-bash\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span>pragma solidity ^0.6.1<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(130, 170, 255)\">import<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(173, 219, 103)\">\".\/CharitySplitter.sol\"<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>contract CharitySplitterFactory <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>    mapping <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>address <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">&gt;<\/span><span> CharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> public charitySplitters<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    uint public errorCount<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    event ErrorHandled<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>string reason<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    event ErrorNotHandled<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>bytes reason<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">function<\/span><span> createCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>address charityOwner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> public <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>        try new CharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>charityOwner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><span>            returns <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>CharitySplitter newCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><span>        <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>            charitySplitters<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">[<\/span><span>msg.sender<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">]<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<\/span><span> newCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>        <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span> catch <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>            errorCount++<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>        <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<p class=\"chakra-text css-gi02ar\">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 <span class=\"chakra-text css-ons8vw\">new CharitySplitter<\/span> is itself part of an internal call, any errors it raises will not be caught. Sample demonstrating this behaviour is the modified <span class=\"chakra-text css-ons8vw\">createCharitySplitter<\/span> function. Here the <span class=\"chakra-text css-ons8vw\">CharitySplitter<\/span> constructor input parameter is retrieved dynamically from another function \u2014 <span class=\"chakra-text css-ons8vw\">getCharityOwner<\/span>. If that function reverts, in this example with <span class=\"chakra-text css-ons8vw\">&#8220;revert-required-for-testing&#8221;<\/span>, that will not be caught in the try\/catch statement.<\/p>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-bash\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span class=\"token\" style=\"color:rgb(127, 219, 202)\">function<\/span><span> createCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>address _charityOwner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> public <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>    try new CharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>getCharityOwner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>_charityOwner, <\/span><span class=\"token\" style=\"color:rgb(255, 88, 116)\">false<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">))<\/span><span>\n<\/span><span>        returns <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>CharitySplitter newCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>        charitySplitters<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">[<\/span><span>msg.sender<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">]<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<\/span><span> newCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span> catch <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>bytes memory reason<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>        <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">..<\/span><span>.\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(127, 219, 202)\">function<\/span><span> getCharityOwner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>address _charityOwner, bool _toPass<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><span>        internal returns <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>address<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>    require<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>_toPass, <\/span><span class=\"token\" style=\"color:rgb(173, 219, 103)\">\"revert-required-for-testing\"<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(255, 203, 139)\">return<\/span><span> _charityOwner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<h2 class=\"chakra-heading group css-1kpzc4q\" id=\"retrieving-the-error-message\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"retrieving the error message permalink\" href=\"#retrieving-the-error-message\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Retrieving the error message<\/h2>\n<p class=\"chakra-text css-gi02ar\">We can further extend the try\/catch logic in the <span class=\"chakra-text css-ons8vw\">createCharitySplitter<\/span> function to retrieve the error message if one was emitted by a failing <span class=\"chakra-text css-ons8vw\">revert<\/span> or <span class=\"chakra-text css-ons8vw\">require<\/span> and emit it in an event. There are two ways to achieve this:<\/p>\n<h3 class=\"chakra-heading group css-xuzltg\" id=\"1-using-catch-errorstring-memory-reason\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"1 using catch errorstring memory reason permalink\" href=\"#1-using-catch-errorstring-memory-reason\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>1. Using <span class=\"chakra-text css-ons8vw\">catch Error(string memory reason)<\/span><\/h3>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-bash\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span class=\"token\" style=\"color:rgb(127, 219, 202)\">function<\/span><span> createCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>address _charityOwner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> public <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>    try new CharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>_charityOwner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> returns <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>CharitySplitter newCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>        charitySplitters<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">[<\/span><span>msg.sender<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">]<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<\/span><span> newCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span>    catch Error<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>string memory reason<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>        errorCount++<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>        CharitySplitter newCharitySplitter <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<\/span><span> new\n<\/span><span>            CharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>msg.sender<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>        charitySplitters<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">[<\/span><span>msg.sender<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">]<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<\/span><span> newCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>        \/\/ Emitting the error <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">in<\/span><span> event\n<\/span><span>        emit ErrorHandled<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>reason<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span>    catch\n<span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>        errorCount++<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<p class=\"chakra-text css-gi02ar\">Which emits the following event on a failed constructor require error:<\/p>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-bash\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span>CharitySplitterFactory.ErrorHandled<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>\n<\/span><span>    reason: <\/span><span class=\"token\" style=\"color:rgb(173, 219, 103)\">'no-owner-provided'<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>type: string<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<h3 class=\"chakra-heading group css-xuzltg\" id=\"2-using-catch-bytes-memory-reason\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"2 using catch bytes memory reason permalink\" href=\"#2-using-catch-bytes-memory-reason\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>2. Using <span class=\"chakra-text css-ons8vw\">catch (bytes memory reason)<\/span><\/h3>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-bash\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span class=\"token\" style=\"color:rgb(127, 219, 202)\">function<\/span><span> createCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>address charityOwner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> public <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>    try new CharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>charityOwner<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><span>        returns <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>CharitySplitter newCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>        charitySplitters<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">[<\/span><span>msg.sender<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">]<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<\/span><span> newCharitySplitter<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span>    catch <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>bytes memory reason<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span>\n<\/span><span>        errorCount++<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>        emit ErrorNotHandled<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>reason<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<p class=\"chakra-text css-gi02ar\">Which emits the following event on a failed constructor require error:<\/p>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-bash\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span>CharitySplitterFactory.ErrorNotHandled<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>\n<\/span><span>  reason: hex<\/span><span class=\"token\" style=\"color:rgb(173, 219, 103)\">'08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000116e6f2d6f776e65722d70726f7669646564000000000000000000000000000000'<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>type: bytes<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<p class=\"chakra-text css-gi02ar\">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.<\/p>\n<h2 class=\"chakra-heading group css-1kpzc4q\" id=\"future-plans\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"future plans permalink\" href=\"#future-plans\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Future plans<\/h2>\n<p class=\"chakra-text css-gi02ar\">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:<\/p>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-bash\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span>catch CustomErrorA<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>uint data1<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span> \u2026 <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span>catch CustomErrorB<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>uint<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">[<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">]<\/span><span> memory data2<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span> \u2026 <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><span>catch <\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<p><br \/>\n<br \/><a href=\"https:\/\/blog.ethereum.org\/en\/2020\/01\/29\/solidity-0-6-try-catch\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":18372,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"tdm_status":"","tdm_grid_status":"","footnotes":""},"categories":[24],"tags":[],"kronos_expire_date":[],"class_list":["post-18371","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ethereum"],"_links":{"self":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/posts\/18371","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/comments?post=18371"}],"version-history":[{"count":0,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/posts\/18371\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/media\/18372"}],"wp:attachment":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/media?parent=18371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/categories?post=18371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/tags?post=18371"},{"taxonomy":"kronos_expire_date","embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/kronos_expire_date?post=18371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}