नमस्ते दुनिया जो त्रुटियों को संभालती है


9

निम्नलिखित कार्यक्षमता के साथ एक कार्यक्रम या फ़ंक्शन लिखें:

  • प्रोग्राम / फ़ंक्शन पहले Hello, world!मानक आउटपुट स्ट्रीम को स्ट्रिंग लिखने का प्रयास करता है । (आउटपुट का कोई अन्य रूप इस चुनौती के लिए स्वीकार्य नहीं है, क्योंकि कार्यक्रम के तुच्छ व्यवहार के बजाय I / O पर ध्यान बहुत अधिक है।) इस पर निर्भर करता है कि क्या यह सफल हुआ:
    • यदि यह आउटपुट करने में सफल रहा Hello, world!, तो प्रोग्राम / फ़ंक्शन बिना किसी और व्यवहार के बाहर निकल जाता है।
    • यदि यह एक त्रुटि के कारण सही आउटपुट का उत्पादन करने में विफल रहा, तो प्रोग्राम / फ़ंक्शन Error writing "Hello, world!"मानक त्रुटि स्ट्रीम को स्ट्रिंग लिखने का प्रयास करता है । (इस चुनौती के प्रयोजनों के लिए, आपको त्रुटि से निपटने के लिए त्रुटि से निपटने की आवश्यकता नहीं है।)

स्पष्टीकरण

  • आपका प्रोग्राम / फ़ंक्शन बिना किसी इनपुट के चलाया जाएगा (जब तक कि यह उस भाषा में नहीं लिखा जाता है, जिसे काम करने के लिए बिल्कुल इनपुट की आवश्यकता होती है, उस स्थिति में इसे सबसे सरल संभव इनपुट के साथ चलाया जाएगा)।

  • आउटपुट का उत्पादन करते समय, यदि आप चाहें तो एक एकल अनुगामी न्यूलाइन का उत्पादन भी कर सकते हैं, लेकिन ऐसा करना अनिवार्य नहीं है।

  • "मानक आउटपुट में त्रुटि लेखन" की परिभाषा जो आपके कार्यक्रम को लागू करती है उसे कम से कम निम्नलिखित मामलों को त्रुटियों के रूप में मानना ​​चाहिए:

    • स्टैण्डर्ड आउटपुट stdoutनॉनटेन्स्टेंट (यानी एक बंद फाइलहैंडल है, कोई फाइल डिस्क्रिप्टर 1 मौजूद नहीं है, या फिर भी उन मामलों का भाषा और ओएस में अनुवाद होता है जिनका आप उपयोग कर रहे हैं);
    • मानक आउटपुट एक डिस्क पर एक फ़ाइल का संदर्भ देता है जिसमें कोई खाली स्थान नहीं बचा है;
    • मानक आउटपुट दूसरे प्रोग्राम से जुड़ रहा है, जिसने पहले ही कनेक्शन का अपना अंत बंद कर दिया है।

    और कम से कम निम्नलिखित मामलों को सफलता के रूप में मानें (अर्थात त्रुटि नहीं):

    • मानक आउटपुट एक टर्मिनल से जुड़ता है, और Hello, world!ऑनस्क्रीन प्रदर्शित होता है।
    • मानक आउटपुट एक फ़ाइल से जुड़ता है, और फ़ाइल Hello, world!में लिखा जाता है।

    आप आउटपुट त्रुटि के रूप में क्या गिनाते हैं, इसका विवरण चुन सकते हैं, जब तक कि यह उपरोक्त नियमों के अनुरूप हो।

  • ऊपर सूचीबद्ध किसी भी त्रुटि स्थिति का सामना करने पर आपका कार्यक्रम / फ़ंक्शन क्रैश नहीं होना चाहिए। यह आपके ऊपर है कि आप किस एग्जिट कोड का उपयोग करते हैं।

  • आपके प्रोग्राम / फ़ंक्शन को मानक त्रुटि स्ट्रीम पर सामना की गई त्रुटि की प्रकृति का वर्णन नहीं करना चाहिए; यह सिर्फ ऊपर निर्दिष्ट स्ट्रिंग मुद्रित करना चाहिए। मानक त्रुटि (जैसे संकलक चेतावनी) पर अत्यधिक उत्पादन केवल कानूनी है यदि यह बिना शर्त के उत्पादन किया जाता है, भले ही कोई त्रुटि सामने आई हो या नहीं।

  • आपके कार्यक्रम को केवल एक ऑपरेटिंग सिस्टम पर काम करने की आवश्यकता है (हालांकि यह एक होना चाहिए, जिस पर ऊपर सूचीबद्ध त्रुटियां हैं, मैंने उन्हें सबसे मल्टीटास्किंग उपभोक्ता ऑपरेटिंग सिस्टम पर काम करने के लिए सामान्य रूप से बनाए रखने की कोशिश की है, लेकिन वाइडर ऑपरेटिंग सिस्टम अच्छी तरह से हो सकते हैं इस चुनौती से बाहर रखा गया)। यदि आपका प्रोग्राम नॉनपोर्टेबल है, तो उन मान्यताओं को सूचीबद्ध करें, जिन्हें आपके सबमिशन के शीर्षक में चलाने की आवश्यकता है।

  • यह कार्य हर भाषा में संभव नहीं हो सकता है (प्रत्येक भाषा एक कार्यक्रम को कस्टम तरीके से आउटपुट त्रुटियों को संभालने की अनुमति नहीं देती है)। आपको एक भाषा चुननी होगी जहाँ यह संभव है।

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

परीक्षण के मामलों

bashलिनक्स पर उपयोग करने के बाद ऊपर दी गई प्रत्येक त्रुटि की स्थिति का अनुकरण करने का एक तरीका है (आपको लिनक्स का उपयोग करने की आवश्यकता नहीं है, लेकिन यह संभवतः इस पर परीक्षण करने के लिए सबसे आसान प्रणाली है):

your_program_here >&-           # nonexistent stdout
your_program_here > /dev/full   # out of disk space
mkfifo test  # note: change "test" to a filename that isn't in use
true < test &
your_program_here > test        # connecting to a program that doesn't want input
rm test      # clean up the FIFO we used earlier

पहले दो टेस्टकेस नियतात्मक हैं। अंतिम नहीं है (यह एक दौड़ की स्थिति पर निर्भर करता है); परीक्षण उद्देश्यों के लिए, मैं आपके कार्यक्रम की शुरुआत और मानक आउटपुट के वास्तविक आउटपुट के बीच देरी को जोड़ने की सलाह देता हूं, ताकि यह सुनिश्चित किया जा सके कि रेस की स्थिति उस तरीके से हल हो गई है जो त्रुटि को उजागर करती है।

विजय की स्थिति

यह है एक चुनौती, इसलिए कम बेहतर है। हमेशा (लगभग), हम बाइट्स में प्रोग्राम की लंबाई माप रहे हैं।


1
क्या आप जानते हैं कि विंडोज पर इसका परीक्षण करने का कोई तरीका है? मैं पहली कसौटी का परीक्षण कर सकता हूं, लेकिन डिस्क के पूर्ण होने के बारे में नहीं ...
स्टिव ग्रिफिन

दौड़ की स्थिति को कम करने के लिए, क्या आप उपयोग कर सकते हैं sleep 1 < test; (sleep 2; your_program_here) > test?
नील

जवाबों:


6

बैश , 71 60 बाइट्स

h=Hello,\ world!
(echo $h)2>&-||echo Error writing \"$h\">&2

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

Hello, world!चर एच को बचाने के बाद , हम निम्नलिखित करते हैं।

सबसे पहले, STDOUT (echo $h)2>&-पर प्रिंट Hello, world!करने का प्रयास । 2>&-त्रुटि संदेश प्रतिध्वनि को प्रदर्शित करने से रोकने के लिए आवश्यक है : त्रुटि लिखें: लेखन विफल होने की स्थिति में खराब फ़ाइल विवरणक । चूंकि एक नामित पाइप लिखने के लिए, जो इनपुट स्वीकार नहीं करता है, सिग्नल 13 (SIGPIPE) के साथ बैश प्रोग्राम को मार देगा, हम कमांड को सबशेल () में निष्पादित करते हैं (...), इसलिए केवल सबस्क्रिप्शन को मार दिया जाएगा।

अंत में, यदि STDOUT में छपाई विफल हो गई, तो उप-शून्य गैर-स्थिति स्थिति कोड (141 SIGPIPE के लिए 141, एक सामान्य त्रुटि के लिए) के साथ बाहर निकल जाएगी, इसलिए echo Error writing \"$h\">&2STDERR को वांछित संदेश प्रिंट करता है।




1

सी (जीसीसी) , 87 86 बाइट्स

f(){signal(13,1);write(1-puts("Hello, world!"),"Error writing \"Hello, world!\"",29);}

इसे ऑनलाइन आज़माएं!

Ungolfed

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void f(void)
{
    signal(SIGPIPE, SIG_IGN); // Works (and is required) on TIO. YMMV
    int fd = (puts("Hello, world!")) < 0 ? 2 : -13;
    write(fd, "Error writing \"Hello, world!\"", 29);
}

आप कैसे जानते हैं कि क्या रिटर्न डालता है? यहाँ कहते हैं कि यह ठीक है = = 0 सभी के लिए ठीक है ...
RosLuP

putsत्रुटि के मामले में लिखे गए बाइट्स की संख्या या -1 लिखा है , इसलिए यह या तो 14 (हैलो वर्ल्ड प्लस न्यूलाइन) या -1 देता है । (यह प्लेटफ़ॉर्म-विशिष्ट हो सकता है, लेकिन यह इसी तरह से ग्लिब के साथ व्यवहार करता है।)
डेनिस

K & R2 का कहना है कि यदि त्रुटि हुई तो यह EOF [-1] को लौटा देता है; या यदि सभी ठीक नहीं तो एक मूल्य नकारात्मक नहीं है
RosLuP

1
PPCG पर, भाषाएं उनके कार्यान्वयन से परिभाषित होती हैं, और gcc / glibc जैसा व्यवहार करती हैं, जैसा मैंने कहा कि वे करते हैं।
डेनिस

मैं पुरानी किताब पसंद करता
हूं

1

पॉवरशेल, 80 बाइट्स

try{echo($h="Hello, World!") -ea 4}catch{$host.ui|% *rL* "Error writing ""$h"""}

व्याख्या की:

try{
    #Attempt to 'echo' (write output) the string, and assign it to $h
    #Make sure the 'error action' is set to '4' to make it a terminating error.
    echo($h="Hello, World!") -ea 4
} catch { 
    #Use the "WriteErrorLine" function in $host.ui to stderr
    $host.ui|% *rL* "Error writing ""$h"""
}

यह वास्तव में जब यह त्रुटि है, तो यह कोशिश करने में कामयाब नहीं है, लेकिन यह निश्चित रूप से ~ काम करना चाहिए।


त्रुटि संदेश STDERR को लिखा जाना चाहिए । अगर पहले लिखने के प्रयास के दौरान कोई त्रुटि होती है तो इसे STDOUT पर लिखना संभव नहीं है।
डेनिस

@ इसके लिए धन्यवाद, वहां अपडेट किया गया, सवाल को पूरी तरह से नहीं पढ़ा।
कॉल्व्स

Afaict PowerShell केवल घातक अपवादों को पकड़ता है, इसलिए आपको इसकी आवश्यकता होगी Write-Host -ErrorAction Stopया ऐसा कुछ होगा। इसके अलावा, throwअतिरिक्त डिबगिंग अंतर्ग्रहण का उत्पादन करता है लाइन के अलावा इसे प्रिंट करना चाहिए, जिस तरह से एचडब्ल्यू स्ट्रिंग के चारों ओर एक लोअरकेस डब्ल्यू और डबल उद्धरण होना चाहिए ।
डेनिस

@ डेनिस की अतिरिक्त डिबग जानकारी ने मुझे कुचल दिया है, जवाब अब वहां अपडेट किया गया है।
Colsw

1

जावास्क्रिप्ट, 79 76 बाइट्स

try{(l=console).log(a="Hello, world!")}catch(e){l.error('Error writing '+a)}

ध्यान दें कि आपको जो स्ट्रिंग आउटपुट चाहिए 'Hello, world!'वह एक बाइट है जो आपके द्वारा उपयोग किए जाने से अधिक लंबी है। इसके अलावा, मुझे लगता aहै कि कॉल के अंदर असाइन console.logकरना कम (1B) होगा और l.log(a)दूसरे बाइट को बचाने के बाद अर्धविराम को हटा दिया जाएगा ।
ल्यूक

@ लुक थैंक्स, यह काफी बड़ी गलती थी!
मैथ्यू रोह

1
try{(l=console).log(a="Hello, world!")}catch(e){l.error('Error writing '+a)}76 बाइट्स के लिए। पहले, consoleको सौंपा गया है l, फिर "Hello, world!'उसे सौंपा गया है a, और फिर उसे निष्पादित किया गया है।
ल्यूक

0

पर्ल 5, 51 बाइट्स

की आवश्यकता है -M5.01, जो मुफ़्त है

say$h="Hello, world!"or die"Error writing \"$h\"$/"

स्ट्रॉबेरी पर्ल 5.24.0 में परीक्षण कार्यक्रम के रूप में (जैसे मानक उत्पादन के लिए मुद्रित) और चलाकर किया जाता है

print f $h="Hello, world!"or die"Error writing \"$h\"$/"

(मानक त्रुटि के लिए मुद्रित)। मुझे नहीं पता कि स्ट्राबेरी का उपयोग करने वाली अन्य त्रुटियों के लिए कैसे परीक्षण किया जाए, लेकिन उन्हें वही संभाला जाना चाहिए…।


जहाँ तक मैं बता सकता हूँ, यह काम नहीं करता है। tio.run/nexus/bash#jY3NDoIwEITvfYq1IXCiiD83ys3Ei2/… (स्ट्रिंग भी अल्पविराम याद कर रही है।)
डेनिस

मुझे नहीं पता कि आप जिस पेज से जुड़े हैं, उस पेज का क्या बनाना है; क्या आप समझा सकते हैं, कृपया इसके अलावा, ध्यान दें कि स्क्रिप्ट को केवल एक ओएस पर काम करने की आवश्यकता है। और मैं अल्पविराम जोड़ूंगा; धन्यवाद।
msh210

आउटपुट को दूसरों के Hello, world!बाद === 1 ===और कुछ के बाद प्रदर्शित करना चाहिए । डिबग को दूसरों के बाद === 1 ===और Error writing "Hello, world!"बाद में कुछ भी प्रदर्शित नहीं करना चाहिए । मुझे पता है कि आपके प्रोग्राम को TIO पर काम करने की आवश्यकता नहीं है , लेकिन print f...मूल प्रोग्राम नहीं होने पर इच्छित त्रुटि संदेश दिखाता है।
डेनिस

"आउटपुट" और "डीबग" दोनों ही मुझे जहां तक ​​दिखाई देते हैं, कुछ भी प्रदर्शित नहीं करते हैं। मैं यह भी नहीं जानता कि "हेडर" और "पाद" खंड क्या होना चाहिए। और मैं पूरी तरह से TIO से अपरिचित हूं, लेकिन ध्यान दें कि स्ट्राबेरी पर्ल एमएस विंडोज पर चलता है।
msh210

एक वैरिएबल में स्ट्रिंग को संग्रहीत करने के विचार के लिए डेनिस को हैट-टिप (हालांकि मुझे शायद लगा होगा कि मैंने वहां नहीं देखा था)।
msh210

0

आरईएक्सएक्स, 111 106 बाइट्स

signal on notready
a='Hello, world!'
_=lineout(,a)
exit
notready:_=lineout('stderr','Error writing "'a'"')

कार्यक्रम वहाँ 'स्ट्रीमर' नामक एक धारा पर निर्भर करता है। शायद आईबीएम सिस्टम पर ऐसा नहीं होगा।


0

सी, 77 बाइट्स

f(a){a="Error writing \"Hello, world!\"";write(1,a+15,13)-13&&write(2,a,29);}

कॉल के लिए

main(){f(1); return 0;}

आपने किस प्लेटफ़ॉर्म पर यह परीक्षण किया? यदि टूटे हुए पाइप का सामना करना पड़ता है तो यह लिनक्स पर काम नहीं करता है।
डेनिस

0

आर , 91 बाइट्स

s="Hello, world!"
tryCatch(cat(s),error=function(e)cat('Error writing "','"',file=2,sep=s))

इसे ऑनलाइन आज़माएं!

मैंने cat(s,file=12)इसके बजाय इसे चलाने की कोशिश की cat(s), और यह सही पाठ को stderr पर प्रिंट करता है। यह invalid connectionअन्यथा एक त्रुटि है।


किसी भी विचार कैसे अन्य उत्पादन त्रुटियों के लिए परीक्षण करने के लिए?
JayCe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.