मैंने नेट-मानक 2.1 (सी # 8.0) प्रोजेक्ट में कुछ स्थिर फेंक सहायक विधियों को लागू किया है।

[DoesNotReturn]
public static void InvalidOperation(String message, String caller, String path, Int32 line)
{
  throw new InvalidOperationException($"{message}\n{caller}|{path}|{line}");
}

मैं उन्हें NET 5.0 प्रोजेक्ट में उपयोग करना चाहता हूं जैसे:

public static BitmapSource GetBitmapSource(String uri)
{
    if (Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out Uri? _uri))
    {
        return new BitmapImage(_uri);
    }

    Throw.InvalidOperation( $"Invalid uri {uri}.");
}

लेकिन संकलक अभी भी त्रुटि देता है CS0161: "सभी कोड पथ एक मान नहीं लौटाते हैं"

0
MaxMa 21 मार्च 2021, 20:04
puplic? ठीक है, आपको Throw.InvalidOperation( $"Invalid uri {uri}."); जैसी विधियों के साथ अपवादों को फेंकने का उपयोग नहीं करना चाहिए आप अपवाद फैब्लिक कर सकते हैं और जैसे: throw MyExceptionGenerator.InvalidOperation($"Invalid uri {uri}."); का उपयोग कर सकते हैं, लेकिन सबसे अच्छा अभ्यास new ऑपरेटर द्वारा अपवाद उत्पन्न करना है - आपको नया उत्पन्न करना चाहिए अपवाद वर्ग और जैसे उपयोग करें: throw new MyInvalidOperaionException($"Invalid uri {uri}.")
 – 
Leszek Mazur
21 मार्च 2021, 20:12
अपवाद कहां फेंका गया था, यह जानने के लिए मैं CallerMemberName, CallerFilePath, और CallerLineAttributes का उपयोग करना पसंद करता हूं। इसलिए मैं उन सहायक विधियों का उपयोग कर रहा हूं। मैंने उन सहायक विधियों को कई बार देखा है। यहाँ पसंद करें: endjin.com /ब्लॉग/2020/08/…
 – 
MaxMa
21 मार्च 2021, 20:19
1
विशेषताएँ अतिरिक्त विश्लेषण के संदर्भ में संकलक की मदद कर सकती हैं, लेकिन जहाँ तक मुझे पता है कि वे अभी भी आपको रीचैबिलिटी के भाषा नियमों का उल्लंघन करने की अनुमति नहीं देते हैं ... आपकी विधि का अंत अभी भी संकलक के रूप में उपलब्ध है संबंधित है।
 – 
Jon Skeet
21 मार्च 2021, 20:26
यह वह नहीं था जो मैं सुनना चाहता था, श्रीमान स्कीट। :-( लेकिन फिर भी, स्पष्टीकरण के लिए धन्यवाद।
 – 
MaxMa
21 मार्च 2021, 20:31
यह ExceptionDispatchInfo.Throw के समान है। हम जानते हैं कि इसके बाद की लाइनें पहुंच से बाहर हैं लेकिन भाषा को वापसी की आवश्यकता है। आप एक डमी रिटर्न डाल सकते हैं या अशक्त कर सकते हैं लेकिन यह सबसे अच्छी बात नहीं है... या बस ऊपर टिप्पणी में सुझाव पर स्विच करें, throw ThrowHelper.Whatever() या उस ऑर्डर को स्विच करें जिसे आप चेक करते हैं
 – 
pinkfloydx33
21 मार्च 2021, 20:38

1 उत्तर

सबसे बढ़िया उत्तर

पहले असाधारण पथ लिखें:

public static BitmapSource GetBitmapSource(String uri)
{
    if (!Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out Uri? _uri))
    {
        Throw.InvalidOperation( $"Invalid uri {uri}.");
    }

    return new BitmapImage(_uri);
}

अब, जहां तक ​​​​कंपाइलर का संबंध है, विधि वापस आती है।


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


वैसे, इसे खोजने वाले लोगों के संदर्भ के लिए, मेरा मानना ​​है कि प्रश्न में सहायक विधि का उद्देश्य इनका उपयोग करना है: आरक्षित विशेषताएं: कॉलर की जानकारी निर्धारित करें

0
Theraot 21 मार्च 2021, 20:43
धन्यवाद। फेंकने के बजाए अपवाद लौटाना ज्यादातर मामलों में सबसे अच्छा समाधान प्रतीत होता है। मुझे बस उम्मीद थी कि संकलक विशेषता से पहुंच योग्यता का अनुमान लगाएगा। और हाँ, मेरा मतलब लिंक्ड कॉलर विशेषताओं से था। स्पष्टीकरण के लिए धन्यवाद।
 – 
MaxMa
21 मार्च 2021, 21:21