Trending News

BTC
$16,966.38
+0.15
ETH
$1,248.52
-0.62
LTC
$78.27
-2.09
DASH
$45.76
-1.97
XMR
$142.43
-0.84
NXT
$0.00
+6.04
ETC
$19.31
-0.16

सॉलिडिटी 0.6.x विशेषताएं: ट्राई/कैच स्टेटमेंट

0



कोशिश/पकड़ सिंटैक्स 0.6.0 में पेश किया गया सॉलिडिटी में त्रुटि प्रबंधन क्षमताओं में यकीनन सबसे बड़ी छलांग है, क्योंकि कारण स्ट्रिंग्स के लिए फिर लौट आना तथा ज़रूरत होना v0.4.22 में जारी किए गए थे। दोनों प्रयत्न तथा पकड़ खोजशब्द आरक्षित किए गए हैं v0.5.9 . के बाद से और अब हम उनका उपयोग विफलताओं को संभालने के लिए कर सकते हैं बाहरी फ़ंक्शन कॉल पूरे लेन-देन को वापस किए बिना कॉल करता है (कॉल किए गए फ़ंक्शन में राज्य परिवर्तन अभी भी वापस लुढ़क गए हैं, लेकिन कॉलिंग फ़ंक्शन में नहीं हैं)।

हम एक लेन-देन जीवनचक्र में शुद्धतावादी “ऑल-ऑर-नथिंग” दृष्टिकोण से एक कदम दूर जा रहे हैं, जो व्यावहारिक व्यवहार से कम है जो हम अक्सर चाहते हैं।

बाहरी कॉल विफलताओं को संभालना

कोशिश/पकड़ बयान आपको असफल होने पर प्रतिक्रिया करने की अनुमति देता है बाहरी कॉल और अनुबंध निर्माण कॉल करता है, इसलिए आप इसका उपयोग इसके लिए नहीं कर सकते आंतरिक फ़ंक्शन कॉल। ध्यान दें कि एक ही अनुबंध के भीतर एक सार्वजनिक फ़ंक्शन कॉल को ट्राइ/कैच के साथ लपेटने के लिए, इसे फ़ंक्शन को कॉल करके बाहरी बनाया जा सकता है यह।.

नीचे दिया गया उदाहरण दर्शाता है कि फ़ैक्टरी पैटर्न में कोशिश/पकड़ का उपयोग कैसे किया जाता है जहां अनुबंध निर्माण विफल हो सकता है। निम्नलिखित चैरिटी स्प्लिटर अनुबंध के लिए एक अनिवार्य पता संपत्ति की आवश्यकता होती है _मालिक इसके कंस्ट्रक्टर में।

pragma solidity ^0.6.1;

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

एक कारखाना अनुबंध है – चैरिटी स्प्लिटर फैक्ट्री जिसका उपयोग के उदाहरण बनाने और प्रबंधित करने के लिए किया जाता है चैरिटी स्प्लिटर. कारखाने में हम लपेट सकते हैं नया चैरिटी स्प्लिटर (चैरिटी ओनर) एक असफल के रूप में कोशिश/पकड़ में जब वह कन्स्ट्रक्टर खाली होने के कारण विफल हो सकता है दान का स्वामी पारित किया जा रहा है।

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++;
        }
    }
}

ध्यान दें कि कोशिश/पकड़ के साथ, बाहरी कॉल के अंदर होने वाले अपवाद ही पकड़े जाते हैं। अभिव्यक्ति के अंदर त्रुटियाँ पकड़ में नहीं आती हैं, उदाहरण के लिए यदि इनपुट पैरामीटर के लिए नई चैरिटी स्प्लिटर स्वयं एक आंतरिक कॉल का हिस्सा है, इसके द्वारा उठाए गए किसी भी त्रुटि को पकड़ा नहीं जाएगा। इस व्यवहार को प्रदर्शित करने वाला नमूना संशोधित है क्रिएटचैरिटीस्प्लिटर समारोह। यहां ही चैरिटी स्प्लिटर कंस्ट्रक्टर इनपुट पैरामीटर को दूसरे फ़ंक्शन से गतिशील रूप से पुनर्प्राप्त किया जाता है – चैरिटी ओनर प्राप्त करें. यदि वह फ़ंक्शन वापस आ जाता है, तो इस उदाहरण में “वापसी-आवश्यक-परीक्षण के लिए”जो ट्राई/कैच स्टेटमेंट में नहीं पकड़ा जाएगा।

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;
}

त्रुटि संदेश पुनर्प्राप्त करना

हम कोशिश/पकड़ तर्क को आगे बढ़ा सकते हैं क्रिएटचैरिटीस्प्लिटर त्रुटि संदेश को पुनः प्राप्त करने के लिए कार्य करता है यदि कोई विफल होने से उत्सर्जित होता है फिर लौट आना या ज़रूरत होना और इसे एक घटना में उत्सर्जित करें। इसे हासिल करने के दो तरीके हैं:

1. का उपयोग करना कैच एरर (स्ट्रिंग मेमोरी कारण)

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++;
    }
}

जो एक असफल कंस्ट्रक्टर पर निम्न घटना का उत्सर्जन करता है उसे त्रुटि की आवश्यकता होती है:

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

2. उपयोग करना पकड़ (बाइट्स मेमोरी कारण)

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

जो एक असफल कंस्ट्रक्टर पर निम्न घटना का उत्सर्जन करता है उसे त्रुटि की आवश्यकता होती है:

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

त्रुटि स्ट्रिंग को पुनर्प्राप्त करने के लिए उपरोक्त दो विधियां समान परिणाम उत्पन्न करती हैं। अंतर यह है कि दूसरी विधि त्रुटि स्ट्रिंग को एबीआई-डीकोड नहीं करती है। दूसरी विधि का लाभ यह है कि यदि एबीआई डिकोडिंग त्रुटि स्ट्रिंग विफल हो जाती है या कोई कारण प्रदान नहीं किया जाता है तो इसे भी निष्पादित किया जाता है।

भविष्य की योजनाएं

त्रुटि प्रकारों के लिए समर्थन जारी करने की योजना है, जिसका अर्थ है कि हम विभिन्न प्रकार की त्रुटियों को पकड़ने की अनुमति देने वाली घटनाओं के समान त्रुटियों की घोषणा करने में सक्षम होंगे, उदाहरण के लिए:

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



Source link

Leave A Reply

Your email address will not be published.

Shares