स्काला में अनियंत्रित अपवादों का निर्णय


17

एक जावा प्रोग्रामर के रूप में, मैं हमेशा अनियंत्रित अपवादों का आलोचक रहा हूं। ज्यादातर प्रोग्रामर इसका इस्तेमाल एन-रूट के रूप में कोडिंग सुगमता के लिए करते हैं ताकि बाद में परेशानी पैदा हो। अनचेक किए गए समकक्षों की तुलना में चेक किए गए अपवादों के साथ प्रोग्राम (हालांकि अयोग्य) बहुत मजबूत हैं।

आश्चर्य की बात यह है कि स्काला में, चेकेड एक्ससेप्शन नाम की कोई चीज नहीं है। सभी जावा की जाँच की और अनियंत्रित स्काला में अनियंत्रित हैं।

इस फैसले के पीछे क्या प्रेरणा है? मेरे लिए यह किसी भी बाहरी कोड का उपयोग करते समय समस्याओं की एक विस्तृत श्रृंखला खोलता है। और अगर संयोग से प्रलेखन खराब है, तो इसका परिणाम KILL है।


11
एक जावा प्रोग्रामर के रूप में, मैं हमेशा चेक किए गए अपवादों के लिए महत्वपूर्ण रहा हूं। अनुपयोगी कोड कभी मजबूत नहीं होता है।
माइकल बोर्गवर्ड

जवाबों:


28

चेक किए गए अपवादों को ज्यादातर विफलता माना जाता है। ध्यान दें कि जावा द्वारा अपनाई जाने के बाद कोई भी भाषा नहीं बनाई गई। देखें http://www.artima.com/intv/handcuffs2.html , http://googletesting.blogspot.ru/2009/09/checked-exceptions-i-love-you-but-you.html , http: / /www.mindview.net/Etc/Discussions/CheckedException , आदि

विशेष रूप से, वे असुविधाजनक हैं (सिवाय पुनरावृत्ति को छोड़कर throws Exception)।

स्काला में आपके पास एक बेहतर विकल्प है: वापसी मूल्यों के लिए बीजगणितीय प्रकारों का उपयोग करना Option[T], जैसे कि Either[Exception, T], आपका अपना प्रकार जब आप विशिष्ट मामलों को संभालना चाहते हैं (जैसे इसके बजाय

def foo: Int // throws FileNotFoundException, IllegalStateException

आपके पास

sealed trait FooResult
case class Success(value: Int) extends FooResult
case class FileNotFound(file: File) extends FooResult
case object IllegalState extends FooResult

def foo: FooResult

और उपभोक्ता को अब सभी परिणामों को संभालने की आवश्यकता है)

बाहरी कोड से निपटने के लिए जो अपवादों को फेंकते हैं, आपके पास scala.util.control.exceptionया scala.util.Try(स्कला 2.10 से शुरू)।


4
कभी नहीं समझा कि अधिकांश लोग चेक किए गए अपवादों के तर्क को नहीं संभालते । ज्यादातर लोग अच्छे डेवलपर नहीं हैं। मैं गारंटी देता हूं कि अधिकांश डेवलपर्स वैसे भी त्रुटि परिणाम को संभालने के लिए नहीं जा रहे हैं। वास्तव में, की try..catchतुलना में बहुत अधिक पठनीय लगता है if। मैं और अधिक गारंटी दे सकता हूं कि वही अधिकांश डेवलपर्स कोड लिखने के लिए नहीं जा रहे हैं जो त्रुटि परिणाम देता है - स्काला में बहुत जटिल - जब भी आप चाहें तो एक फ़ंक्शन से वापस नहीं लौट सकते हैं (बस पास्कल की तरह)
पीजस ऑक्टन

5
मुझे लगता है कि आप भ्रामक और साक्ष्य के अभाव में टिप्पणी करते हैं, @ पायस। स्काला में, रिटर्न स्टेटमेंट के रूप में विकल्प चुनने पर, इफ स्टेटमेंट्स के बजाय पैटर्न मैचिंग होने की संभावना है । उस शैली में कुछ के बजाय कोई नहीं लौटना मामूली है, जटिल नहीं है। कम सुराग देने वाले डेवलपर्स उन कार्यों को लिखने का चयन नहीं कर सकते हैं जो बीजीय प्रकारों को वापस करते हैं, लेकिन यह एक अलग बात है। अंत में, जब भी आप चाहते हैं एक समारोह से वापस नहीं कर सकते - बस असत्य।
इसका प्रचंड

7

जावा में जांचे गए अपवाद ऐसी कोई बुरी बात नहीं है। बेशक ADTs Scala के लिए बेहतर विकल्प हो सकता है, लेकिन जावा में, जाँच किए गए अपवादों में अपनी जगह है और साफ-सुथरा कोड तर्क सिर्फ गैर-समझदारी है, चाहे कितने भी ब्लॉग इसे दोहराए। यह मूल रूप से कहता है कि आपको अपने सिस्टम में होने वाली गंभीर और संभावित रूप से खराब होने वाली स्थितियों को खुशी से अनदेखा करना चाहिए, क्योंकि स्क्रू टाइप सिस्टम, सुंदर कोड आपके सिस्टम को स्वचालित रूप से मजबूत बनाता है। इस तरह के तर्क यह भी बताते हैं कि इतने सारे जावा कोडर्स स्वेच्छा से अपने कोड को एक्सएमएल (स्प्रिंग, मेवेन, इत्यादि में स्थानांतरित कर देते हैं, हालांकि मैं यहां सुंदर भाग को याद करता हूं )।

स्काला में जांचे हुए अपवादों नीचे एम Odersky द्वारा दिए गए की कमी के लिए कारण http://www.scala-lang.org/old/node/8787.html आश्चर्य अलग है और समझ में आता है।

सूचियों पर जाँच किए गए अपवादों के साथ समस्या का प्रदर्शन मानचित्र विधि द्वारा किया जाता है:

def map[B](f: A => B): List[B]

@Throws के साथ नक्शा कैसे एनोटेट करें? यदि मानचित्र को @throws एनोटेशन स्वयं नहीं मिलता है, तो संभवतः आप इसे किसी भी फ़ंक्शन को पास नहीं कर सकते हैं जिसमें @throws है। यह उन मानचित्रों के लिए बोझिल प्रतिबंधों और भेदों को पेश करेगा जिनसे मानचित्र का उपयोग किया जा सकता है। चीजें बेहतर होंगी अगर हम किसी तरह बता सकते हैं कि नक्शा सभी अपवादों को फेंकता है जो इसके फ़ंक्शन तर्क को फेंकता है। कुछ प्रभाव प्रणालियाँ हैं जो इसे व्यक्त कर सकती हैं, लेकिन अभी तक मैंने जो देखा है वह बहुत भारी है।

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

चियर्स

यकीन नहीं है, लेकिन मुझे लगता है कि जावा 8 लैंबडा भी अनियंत्रित अपवादों तक ही सीमित हैं।अधिकांश (सभी?) JDK 8 ( java.util.function.*) में नए कार्यात्मक इंटरफेस न तो अनियंत्रित अपवाद घोषित करते हैं और न ही।


2

यदि आप दक्षता हासिल करना चाहते हैं, तो आपको हार माननी होगी। परिशुद्धता / नियंत्रण <- इसके लिए मुझे एक बेहतर शब्द की आवश्यकता है।

जहां तक ​​अमूर्तन जाता है, स्काला शीर्ष की ओर स्थित है। अगर स्काला के लक्ष्यों में से एक कष्टप्रद बॉयलरप्लेट कोड से छुटकारा पा रहा है, तो जावा को देखने के लिए एक स्पष्ट स्थान अपवाद है। यदि आप जावा में तेज कोड लिखना चाहते हैं, तो बस अपने चेक किए गए अपवादों को तब तक फेंकते रहें जब तक कि वे हिट main()न हो जाएं और प्रभावी रूप से अनियंत्रित न हो जाएं।

मुझे नहीं पता कि मैं बिल्कुल वही हूँ जो आप पूछ रहे हैं लेकिन यह मेरी राय में सबसे स्पष्ट कारण है।

खैर, मैंने थोड़ी तलाश की और किसी ने चेक अपवाद की त्रासदी के बारे में लिखा है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.