পাইথন চেষ্টা - অন্য


578

বিবৃতিটির elseal চ্ছিক ধারাটির ব্যবহারটি কী try?


1
বেশিরভাগ উত্তরগুলিতে আমরা কেন চেষ্টা ক্লজটিতে অন্য জিনিসটিতে কেবল উপাদানটি রাখতে পারি না তা কেন্দ্রীভূত বলে মনে হচ্ছে। প্রশ্ন stackoverflow.com/questions/3996329 বিশেষভাবে অনুরোধ কেন অন্য দফা কোড যেতে পারে না পরে তৃতীয় বন্ধনীর নিজেই, এবং যে প্রশ্ন এই এক dupped করা হয়, কিন্তু আমি যে প্রশ্ন এখানে একটি স্পষ্ট উত্তর দেখতে না। আমি মনে করি stackoverflow.com/a/3996378/1503120 চমত্কারভাবে এই প্রশ্নের উত্তর দেয়। আমি স্ট্যাকওভারফ্লো . com/a/22579805/1503120 এ বিভিন্ন ধারাগুলির বিভিন্ন তাত্পর্য বর্ণনা করার চেষ্টা করেছি ।
জামাদগনি

চূড়ান্ত পরিষ্কারের আগে, ব্যতিক্রমটি ট্রিগার না করলে আপনি কিছু ঘটতে চান, এটি একই ব্যতিক্রম হ্যান্ডলিংকে নিজেই ট্রিগার করার কথা নয়।
বেনজিমিন

উত্তর:


857

elseযদি ব্লকের বিবৃতিগুলি কার্যকর করা হয় যদি কার্যকর হয় নীচে থেকে পড়ে try- যদি কোনও ব্যতিক্রম না ঘটে। সত্য, আমি কখনও প্রয়োজন খুঁজে পাই না।

তবে ব্যতিক্রমগুলি নোটগুলি পরিচালনা করে:

অন্য ধারাটির ব্যবহার ট্রাই ক্লজে অতিরিক্ত কোড যুক্ত করার চেয়ে ভাল কারণ এটি দুর্ঘটনাক্রমে এমন ব্যতিক্রম ধরা এড়ায় যা কোড দ্বারা সুরক্ষিত করা না করে চেষ্টা করা হয়েছিল ... বিবৃতি ব্যতীত।

সুতরাং, যদি আপনার এমন কোনও পদ্ধতি থাকে যা উদাহরণস্বরূপ, একটি নিক্ষেপ IOErrorকরতে পারে এবং আপনি এটি ব্যতিক্রমগুলি ধরতে চান তবে প্রথম ক্রিয়াকলাপটি সফল হলে আপনি আরও কিছু করতে চান, এবং আপনি কোনও আইওরর ধরতে চান না এই অপারেশন, আপনি এই জাতীয় কিছু লিখতে পারেন:

try:
    operation_that_can_throw_ioerror()
except IOError:
    handle_the_exception_somehow()
else:
    # we don't want to catch the IOError if it's raised
    another_operation_that_can_throw_ioerror()
finally:
    something_we_always_need_to_do()

আপনি শুধু করিয়ে দিলে another_operation_that_can_throw_ioerror()পর operation_that_can_throw_ioerror, exceptদ্বিতীয় কল ত্রুটি ধরা হবে। এবং যদি আপনি এটি পুরো tryব্লকের পরে রাখেন তবে এটি সর্বদা চালানো হবে এবং এটির পরে না finallyelseআপনি কি নিশ্চিতরূপে করার সুবিধা প্রদান

  1. ব্যতিক্রম না হলে দ্বিতীয় অপারেশনটি কেবল চালানো হবে,
  2. এটি finallyব্লকের আগে চালানো , এবং
  3. IOErrorএটি যে কোনও উত্থাপন করে তা এখানে ধরা পড়ে না

7
এও মনে রাখবেন যে ট্রায়-ব্লক সিএন-এ ব্যবহৃত ভেরিয়েবলগুলি অন্য-ব্লকটিতে ব্যবহার করা যেতে পারে, তাই আপনি যদি অন্য-ব্লকে আরও ব্যতিক্রম প্রত্যাশা না করেন তবে আপনার সর্বদা এই ভেরিয়েন্টটি ব্যবহার করা বিবেচনা করা উচিত
ওয়ার্ল্ডসেন্ডার

3
এতে কিছু যায় আসে না, কারণ ট্রাই-স্কোপড ভেরিয়েবলগুলি অন্য কোনও আছে কিনা তা চেষ্টা করার বাইরে দেখা যায়।
রেন্ডারিয়ান

36
"ট্রাই-স্কোপড ভেরিয়েবল" বলে কোনও জিনিস নেই। পাইথনে, পরিবর্তনীয় স্কোপগুলি শুধুমাত্র মডিউল, ফাংশন এবং বোধগম্যতা দ্বারা প্রতিষ্ঠিত হয়, কাঠামো নিয়ন্ত্রণ করে না।
mhmmith

9
অন্য ধারাটি আপনাকে এমন কোড লিখতে দেয় যা কেবলমাত্র কোনও ব্যতিক্রম ছুঁড়ে না ফেলে যদি বোঝা যায়; বাদে ক্লজটি কেবল পাস করতে পারে। যদি আপনি চেষ্টাটি ব্লকটিতে যুক্তি রাখেন, তবে আপনি আপনার কোডটিতে চুপচাপ বাগগুলি লুকিয়ে রাখার ঝুঁকি নিয়ে থাকেন। স্কোয়াশ ব্যতিক্রমগুলি কখনই আপনি আশা করেননি।
অ্যালিস পুরসেল

9
এটা এই উত্তর কি থেকে স্পষ্ট নয় "নীচে পড়ে" মানে - না শুধুমাত্র এই কারণে এর একটি ব্যতিক্রম কারণ ঘটবে কিন্তু return, continueবা break
এন্টি হাপাল

108

শৈলী এবং পঠনযোগ্যতা ব্যবহার করার একটি বড় কারণ রয়েছে else। কোড রাখার পক্ষে এটি একটি ভাল ধারণা যা তাদের সাথে ডিল করা কোডের কাছে ব্যতিক্রম ঘটায়। উদাহরণস্বরূপ, এগুলি তুলনা করুন:

try:
    from EasyDialogs import AskPassword
    # 20 other lines
    getpass = AskPassword
except ImportError:
    getpass = default_getpass

এবং

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
else:
    # 20 other lines
    getpass = AskPassword

দ্বিতীয়টি যখন ভাল exceptতাড়াতাড়ি ফিরে না আসতে পারে, বা ব্যতিক্রমটিকে আবার ছুঁড়ে ফেলতে পারে good যদি সম্ভব হয় তবে আমি লিখতাম:

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
    return False  # or throw Exception('something more descriptive')

# 20 other lines
getpass = AskPassword

দ্রষ্টব্য: সদ্য পোস্ট করা সদৃশ থেকে উত্তর এখানে অনুলিপি করা হয়েছে , অতএব এই সমস্ত "এসকপ্যাসওয়ার্ড" স্টাফ।


53

একটি ব্যবহার: এমন কিছু কোড পরীক্ষা করুন যা একটি ব্যতিক্রম বাড়াতে পারে।

try:
    this_should_raise_TypeError()
except TypeError:
    pass
except:
    assert False, "Raised the wrong exception type"
else:
    assert False, "Didn't raise any exception"

(এই কোডটি বাস্তবে আরও জেনেরিক পরীক্ষার জন্য বিমূর্ত করা উচিত))


50

পাইথন চেষ্টা - অন্য

elseট্রাই স্টেটমেন্টের al চ্ছিক ধারাটির ব্যবহারটি কী ?

উদ্দেশ্য ব্যবহারটি হ'ল আরও কোড চালনার জন্য একটি প্রসঙ্গ আছে যদি এটির ব্যতিক্রম হ্যান্ডেল হওয়ার আশঙ্কা করা হত না।

এই প্রসঙ্গে দুর্ঘটনাক্রমে ত্রুটিগুলি পরিচালনা করা এড়ানো যায় যা আপনি প্রত্যাশা করেননি।

কিন্তু এটা সুনির্দিষ্ট অবস্থার যে run অন্য দফা কারণ বুঝতে গুরুত্বপূর্ণ, কারণ return, continueএবং breakনিয়ন্ত্রণ প্রবাহ বিঘ্নিত করতে else

সংক্ষেপে

elseবিবৃতি চালায় তাহলে আছে কোন ব্যতিক্রম এবং ফলে বাধাপ্রাপ্ত না হলে return, continueঅথবা breakবিবৃতি।

অন্যান্য উত্তরগুলি সেই শেষ অংশটি মিস করে।

ডক্স থেকে:

And elseচ্ছিক ধারাটি কার্যকর করা হয় যদি এবং কখন এই ধারাটির শেষের দিকে নিয়ন্ত্রণ প্রবাহিত হয়try *

(বোল্ডিং যোগ করা হয়েছে)) এবং পাদটীকাটি পড়ে:

* বর্তমানে, নিয়ন্ত্রণ একটি ব্যতিক্রম বা সঞ্চালনের ক্ষেত্রে ব্যতীত "শেষ বন্ধ প্রবাহিত" return, continueঅথবা breakবিবৃতি।

এর জন্য ক্লজ ( ব্যাকরণ দেখুন ) ব্যতীত কমপক্ষে একটি পূর্বের প্রয়োজন । সুতরাং এটি else(এবং finally) alচ্ছিক হওয়ার সাথে সত্যই এটি "চেষ্টা-অন্য নয়," এটি "চেষ্টা-ছাড়া-অন্য (-ফাইনালি)" নয় ।

পাইথন টিউটোরিয়াল দেয়ার উদ্দেশ্যে ব্যবহারের উপর ব্যাখ্যা করেছেন:

চেষ্টা করুন ... বিবৃতি ব্যতীত অন্য একটি ধারা রয়েছে, যা উপস্থিত থাকলে অবশ্যই ধারাগুলি বাদে সমস্ত অনুসরণ করতে হবে। কোডের জন্য এটি কার্যকর যে ট্রায়াল ক্লজটি যদি কোনও ব্যতিক্রম না বাড়ায় তবে তা কার্যকর করতে হবে। উদাহরণ স্বরূপ:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        print arg, 'has', len(f.readlines()), 'lines'
        f.close()

অন্য ধারাটির ব্যবহার ট্রাই ক্লজে অতিরিক্ত কোড যুক্ত করার চেয়ে ভাল কারণ এটি দুর্ঘটনাক্রমে এমন ব্যতিক্রম ধরা এড়ায় যা কোড দ্বারা সুরক্ষিত করা না করে চেষ্টা করা হয়েছিল ... বিবৃতি ব্যতীত।

ব্লক elseঅনুসরণ করে কোড বনাম পৃথকীকরণের উদাহরণtry

আপনি যদি কোনও ত্রুটি পরিচালনা করেন তবে elseব্লকটি চলবে না। উদাহরণ স্বরূপ:

def handle_error():
    try:
        raise RuntimeError('oops!')
    except RuntimeError as error:
        print('handled a RuntimeError, no big deal.')
    else:
        print('if this prints, we had no error!') # won't print!
    print('And now we have left the try block!')  # will print!

এবং এখন,

>>> handle_error()
handled a RuntimeError, no big deal.
And now we have left the try block!

26

হাঁস-টাইপিংয়ের সাথে ইএএফপি প্যাটার্নটি একত্রিত করার জন্য অন্য চেষ্টা করে দেখুন :

try:
  cs = x.cleanupSet
except AttributeError:
  pass
else:
  for v in cs:
    v.cleanup()

আপনার এই জিনিসটি ঠিক আছে কোডটি ভাল হতে পারে:

try:
  for v in x.cleanupSet:
    v.clenaup()
except AttributeError:
  pass

এটি আপনার কোডটিতে দুর্ঘটনাক্রমে গুরুতর ত্রুটিগুলি লুকানোর একটি দুর্দান্ত উপায়। আমি সেখানে ক্লিনআপ টাইপ-এড করেছি, তবে যে অ্যাট্রিবিউটআরআর আমাকে জানাতে পারে তা গিলে ফেলা হচ্ছে। সবচেয়ে খারাপ কথা, যদি আমি এটি সঠিকভাবে লিখেছিলাম তবে ক্লিনআপ পদ্ধতিটি মাঝেমধ্যে এমন কোনও ব্যবহারকারী টাইপ হয়ে যাচ্ছিল যা একটি ভুল নামযুক্ত বৈশিষ্ট্যযুক্ত ছিল, যার ফলে এটি নিঃশব্দে অর্ধ-পথ ব্যর্থ হয়ে একটি ফাইল বন্ধ রেখে দিয়েছে? সৌভাগ্য যে একটি ডিবাগিং।


19

আপনি যখন এটি পরিষ্কার করতে পেরেছেন তখন আমি সত্যিই এটি দরকারী বলে মনে করি এটি ব্যতিক্রম থাকলেও তা করতে হবে:

try:
    data = something_that_can_go_wrong()
except Exception as e: # yes, I know that's a bad way to do it...
    handle_exception(e)
else:
    do_stuff(data)
finally:
    clean_up()

9

যদিও আপনি এখনই এটির ব্যবহার সম্পর্কে ভাবতে পারেন না, আপনি এখানে বাজি রাখতে পারেন যে এটির জন্য একটি ব্যবহার থাকতে হবে। এখানে একটি অকল্পনীয় নমুনা রয়েছে:

সহ else:

a = [1,2,3]
try:
    something = a[2]
except:
    print "out of bounds"
else:
    print something

ছাড়া else:

try:
    something = a[2]
except:
    print "out of bounds"

if "something" in locals():
    print something

somethingকোনও ত্রুটি নিক্ষেপ না করা হলে এখানে আপনার পরিবর্তনশীল সংজ্ঞায়িত হয়েছে। আপনি tryএটিকে ব্লকের বাইরে সরাতে পারেন , তবে তারপরে কোনও ভেরিয়েবল সংজ্ঞায়িত করা হলে এর জন্য কিছু অগোছালো সনাক্তকরণ প্রয়োজন।


3
something = a[2]; print somethingচেষ্টা করে ভিতরে কী হয়েছে : ব্লক?
এস .লট

@ এস.লোট কিছুই নয়, তবে যদি কেউ আপনাকে একটি তালিকা পাঠাচ্ছে, এবং আপনি সম্ভবত ডেটাটি প্রদর্শন করতে চান না তবে এটি দীর্ঘস্থায়ী না হওয়ায় সম্ভবত এটি দূষিত?
অজানা

12
এস। লট: 'কিছু মুদ্রণ করুন' তার থেকে আলাদা ব্যতিক্রম বাড়াতে পারে যা আপনি বাধা দিতে চান না।
দারিয়াস বেকন

আমি পার্থক্যটি দেখতে পাচ্ছি না। যদি আমি সীমার বাইরে ব্যতিক্রম পাই তবে এটি "সীমা ছাড়াই" মুদ্রণ করে। বুঝেছি. যদি আমি অন্য কিছু ব্যতিক্রম পাই, তবে কোডের এই ব্লকটি এড়িয়ে যায়। যদি আমি কোনও ব্যতিক্রম না পাই তবে আচরণটি হ'ল কোনও কিছুর মান মুদ্রণ করা, যা একটি [2]। এই উদাহরণে আর কী করে আমি তা দেখতে পাচ্ছি না।
এস .লট

3
'কিছু' এর মান, যখন মুদ্রণ করা হবে, এটি এর __str__ () পদ্ধতিতে ত্রুটি বাড়িয়ে তুলতে পারে। যদিও এই উদাহরণটিতে এই মানটি কেবলমাত্র 2, আপনি সম্ভবত ঠিক উল্লেখ করতে পারেন যে এখানে সীমার বাইরেও ব্যতিক্রম নেই।
দারিয়াস বেকন

8

সেখানে একটি চমৎকার উদাহরণ try-elseমধ্যে PEP 380 । মূলত, এটি অ্যালগোরিদমের বিভিন্ন অংশে বিভিন্ন ব্যতিক্রম হ্যান্ডলিং করতে নেমে আসে।

এটি এমন কিছু:

try:
    do_init_stuff()
except:
    handle_init_suff_execption()
else:
    try:
        do_middle_stuff()
    except:
        handle_middle_stuff_exception()

এটি আপনাকে যেখানে ব্যতিক্রম ঘটে তার নিকটতম ব্যতিক্রম হ্যান্ডলিং কোডটি লিখতে দেয়।


7

থেকে ত্রুটি এবং ব্যতিক্রমগুলি # ব্যতিক্রম পরিচালনা - docs.python.org

try ... exceptবিবৃতি একটি ঐচ্ছিক হয়েছে elseদফা, যা, যখন বর্তমান, ক্লজ ছাড়া সমস্ত অনুসরণ করতে হবে। কোডের জন্য এটি কার্যকর যে ট্রায়াল ক্লজটি যদি কোনও ব্যতিক্রম না বাড়ায় তবে তা কার্যকর করতে হবে। উদাহরণ স্বরূপ:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        print arg, 'has', len(f.readlines()), 'lines'
        f.close()

অন্য ধারাটির ব্যবহার ট্রাই ক্লজে অতিরিক্ত কোড যুক্ত করার চেয়ে ভাল কারণ এটি দুর্ঘটনাক্রমে এমন ব্যতিক্রম ধরা এড়ায় যা কোড দ্বারা সুরক্ষিত করা না করে চেষ্টা করা হয়েছিল ... বিবৃতি ব্যতীত।


6

পাইথন রেফারেন্সের দিকে তাকালে মনে হয় এটি elseকার্যকর হয় tryযখন কোনও ব্যতিক্রম নেই after Claচ্ছিক অন্য ক্লজটি কার্যকর করা হয় যদি এবং কখন চেষ্টা ক্লজটির শেষের দিকে নিয়ন্ত্রণ প্রবাহিত হয়। 2 অন্য ধারাটিতে ব্যতিক্রম পূর্ববর্তী দ্বারা ধারাগুলি ব্যতীত পরিচালিত হয় না।

পাইথনে ডুব দেওয়ার একটি উদাহরণ রয়েছে যেখানে, আমি যদি সঠিকভাবে বুঝতে পারি তবে tryব্লকটিতে তারা একটি মডিউল আমদানি করার চেষ্টা করে, যখন এটি ব্যর্থ হয় আপনি ব্যতিক্রম হন এবং ডিফল্ট বাঁধাই করেন কিন্তু এটি যখন কাজ করে তখন আপনার কাছে elseব্লকের মধ্যে যেতে হবে এবং যা প্রয়োজন তা আবদ্ধ করার বিকল্প রয়েছে (দেখুন দেখুন) উদাহরণ এবং ব্যাখ্যা জন্য লিঙ্ক)।

আপনি যদি catchব্লকে কাজ করার চেষ্টা করেন তবে এটি অন্য একটি ব্যতিক্রম হতে পারে - আমার ধারণা elseব্লকটি কার্যকর where


4
"অন্য ধারাটিতে ব্যতিক্রমগুলি ধারাগুলি ব্যতীত পূর্ববর্তী দ্বারা পরিচালিত হয় না" " এটি দরকারী অংশ। ধন্যবাদ.
geowa4

"Elseচ্ছিক অন্য ধারাটি কার্যকর করা হয় যদি এবং যখন নিয়ন্ত্রণের প্রবন্ধের প্রান্তটি প্রবাহিত হয়" তখন অন্য একটি পার্থক্য, যেহেতু আপনি tryব্লকটি থেকে ফিরে আসতে পারেন ।
টোমর ডাব্লু

4

এটাই. চেষ্টা করা ব্যতীত 'অন্য' ব্লক কোডটির জন্য উপস্থিত রয়েছে যা চেষ্টা করা অপারেশন সফল হওয়ার পরে (এবং শুধুমাত্র যখন) চলে। এটি ব্যবহার করা যেতে পারে, এবং এটি অপব্যবহার করা যেতে পারে।

try:
    fp= open("configuration_file", "rb")
except EnvironmentError:
    confdata= '' # it's ok if the file can't be opened
else:
    confdata= fp.read()
    fp.close()

# your code continues here
# working with (possibly empty) confdata

ব্যক্তিগতভাবে, আমি এটি পছন্দ করি এবং উপযুক্ত হলে এটি ব্যবহার করি। এটি শব্দার্থগতভাবে বিবৃতিগুলিকে গ্রুপ করে।


2

সম্ভবত একটি ব্যবহার হতে পারে:

#debug = []

def debuglog(text, obj=None):
    " Simple little logger. "
    try:
        debug   # does global exist?
    except NameError:
        pass    # if not, don't even bother displaying
    except:
        print('Unknown cause. Debug debuglog().')
    else:
        # debug does exist.
        # Now test if you want to log this debug message
        # from caller "obj"
        try:
            if obj in debug:
                print(text)     # stdout
        except TypeError:
            print('The global "debug" flag should be an iterable.')
        except:
            print('Unknown cause. Debug debuglog().')

def myfunc():
    debuglog('Made it to myfunc()', myfunc)

debug = [myfunc,]
myfunc()

হতে পারে এটি আপনাকেও ব্যবহারের দিকে নিয়ে যাবে।


2

try: ... else:আপনি যে অবস্থাতে ডাটাবেস প্রশ্নগুলি চালাচ্ছেন এবং একই প্রশ্নের স্বাদ / প্রকারের একটি পৃথক ডাটাবেসে সেই প্রশ্নের ফলাফলগুলি লগইন করছেন সেই পরিস্থিতিতে আমি নির্মাণটি দরকারী বলে পেয়েছি । ধরা যাক যে আমার কাছে প্রচুর কর্মী থ্রেড রয়েছে যা সমস্ত হ্যান্ডলিং ডেটাবেস কোয়েরিতে জমা দেওয়া আছে to

#in a long running loop
try:
    query = queue.get()
    conn = connect_to_db(<main db>)
    curs = conn.cursor()
    try:
        curs.execute("<some query on user input that may fail even if sanitized">)
    except DBError:
        logconn = connect_to_db(<logging db>)
        logcurs = logconn.cursor()
        logcurs.execute("<update in DB log with record of failed query")
        logcurs.close()
        logconn.close()
    else:

        #we can't put this in main try block because an error connecting
        #to the logging DB would be indistinguishable from an error in 
        #the mainquery 

        #We can't put this after the whole try: except: finally: block
        #because then we don't know if the query was successful or not

        logconn = connect_to_db(<logging db>)
        logcurs = logconn.cursor()
        logcurs.execute("<update in DB log with record of successful query")
        logcurs.close()
        logconn.close()
        #do something in response to successful query
except DBError:
    #This DBError is because of a problem with the logging database, but 
    #we can't let that crash the whole thread over what might be a
    #temporary network glitch
finally:
    curs.close()
    conn.close()
    #other cleanup if necessary like telling the queue the task is finished

অবশ্যই যদি আপনি ফেলে দেওয়া হতে পারে এমন সম্ভাব্য ব্যতিক্রমগুলির মধ্যে পার্থক্য করতে পারেন তবে আপনাকে এটি ব্যবহার করতে হবে না, তবে কোডের একটি সফল টুকরোতে প্রতিক্রিয়া প্রকাশিত কোডটি সফল টুকরা হিসাবে একই ব্যতিক্রম ছুঁড়ে ফেলতে পারে, এবং আপনি ঠিক করতে পারবেন না দ্বিতীয় সম্ভাব্য ব্যতিক্রমটি যেতে দিন বা সাফল্যে তাত্ক্ষণিকভাবে ফিরে যেতে দিন (যা আমার ক্ষেত্রে থ্রেডটি মেরে ফেলবে), তবে এটি কার্যকর হয় না।


1

elseপ্রতিটি exceptব্লকে ঘটে যাওয়া কার্যকারিতা পরিপূরক করতে প্রায়শই একটি ব্লক উপস্থিত থাকতে পারে ।

try:
    test_consistency(valuable_data)
except Except1:
    inconsistency_type = 1
except Except2:
    inconsistency_type = 2
except:
    # Something else is wrong
    raise
else:
    inconsistency_type = 0

"""
Process each individual inconsistency down here instead of
inside the except blocks. Use 0 to mean no inconsistency.
"""

এই ক্ষেত্রে, inconsistency_typeব্লক ব্যতীত প্রতিটিটিতে সেট করা থাকে, যাতে আচরণটি নো-ত্রুটির ক্ষেত্রে পরিপূরক হয় else

অবশ্যই, আমি এটিকে এমন একটি প্যাটার্ন হিসাবে বর্ণনা করছি যা কোনও দিন আপনার নিজের কোডে উঠে আসতে পারে। এই নির্দিষ্ট ক্ষেত্রে, আপনি যাইহোক ব্লকের inconsistency_typeআগে কেবল 0 তে সেট করেছেন try


1

এখানে অন্য একটি জায়গা যেখানে আমি এই নিদর্শনটি ব্যবহার করতে চাই:

 while data in items:
     try
        data = json.loads(data)
     except ValueError as e:
        log error
     else:
        # work on the `data`

1
আপনি কেবল continueপরিবর্তে ব্যবহার করতে পারেন - "ব্রেকআউট আউট" প্যাটার্ন। কোডটি পড়তে সহজ করে তোলে এটি আপনাকে "অন্য" ধারা এবং এর প্রবর্তনকে ছাড়তে দেয়।
ম্যালথে

1

আমি যে ব্যবহারের পরিস্থিতিগুলির কথা ভাবতে পারি তার মধ্যে একটি অনির্দেশ্য ব্যতিক্রম, যা আপনি আবার চেষ্টা করলে অবরুদ্ধ হতে পারে। উদাহরণস্বরূপ, ট্রাই ব্লকের ক্রিয়াকলাপগুলি এলোমেলো সংখ্যার সাথে জড়িত থাকে:

while True:
    try:
        r = random.random()
        some_operation_that_fails_for_specific_r(r)
    except Exception:
        continue
    else:
        break

তবে যদি ব্যতিক্রমটির পূর্বাভাস দেওয়া যায় তবে আপনার ব্যতিক্রমের আগে সর্বদা বৈধতা বেছে নেওয়া উচিত। যাইহোক, সমস্ত কিছুর পূর্বাভাস দেওয়া যায় না, তাই এই কোড প্যাটার্নটির নিজস্ব স্থান রয়েছে।


1
আপনি এটি শেষে breakভিতরে ভিতরে রেখে এটি করতে পারেন tryযা পরিষ্কার আইএমও, এবং আপনার এটির দরকার নেই else। এছাড়াও continueসত্যিই প্রয়োজন হয় না, আপনি ঠিক করতে পারেন pass
দিরবাইও

1

আমি elseসম্ভবত একটি ভুল কনফিগার ফাইল ব্যবহার করার জন্য দরকারী পেয়েছি :

try:
    value, unit = cfg['lock'].split()
except ValueError:
    msg = 'lock monitoring config must consist of two words separated by white space'
    self.log('warn', msg)
else:
     # get on with lock monitoring if config is ok

lockকনফিগারেশন পড়ার ব্যতিক্রম লক মনিটরিং নিষ্ক্রিয় করে এবং ভ্যালুএরফার্স একটি সহায়ক সতর্কতা বার্তা লগ করে।


1

মনে করুন আপনার প্রোগ্রামিংয়ের যুক্তি কোনও প্রদত্ত কী সহ কোনও অভিধানে প্রবেশ রয়েছে কিনা তার উপর নির্ভর করে। আপনি নির্মাণ dict.get(key)ব্যবহারের ফলাফল পরীক্ষা if... else...করতে পারেন, বা আপনি এটি করতে পারেন:

try:
    val = dic[key]
except KeyError:
    do_some_stuff()
else:
    do_some_stuff_with_val(val)

-1

আমি অন্য ব্যবহারের কেস যুক্ত করব যা ডিবি সেশনগুলি পরিচালনা করার সময় সরাসরি দেখায়:

    # getting a DB connection 
    conn = db.engine.connect()

    # and binding to a DB session
    session = db.get_session(bind=conn)

    try:
        # we build the query to DB
        q = session.query(MyTable).filter(MyTable.col1 == 'query_val')

        # i.e retrieve one row
        data_set = q.one_or_none()

        # return results
        return [{'col1': data_set.col1, 'col2': data_set.col2, ...}]

    except:
        # here we make sure to rollback the transaction, 
        # handy when we update stuff into DB
        session.rollback()
        raise

    else:
        # when no errors then we can commit DB changes
        session.commit()

    finally:
        # and finally we can close the session
        session.close()

-17

else:ব্লক বিভ্রান্তিকর এবং (প্রায়) অনর্থক। এটি বিবৃতি forএবং whileবিবৃতি অংশ ।

প্রকৃতপক্ষে, এমনকি কোনও ifস্টেটমেন্টেও, এটি else:সত্যই ভয়ানক উপায়ে ব্যবহার করা যেতে পারে এমন বাগগুলি তৈরি করা যায় যা খুঁজে পাওয়া খুব শক্ত।

এই বিবেচনা.

   if a < 10:
       # condition stated explicitly
   elif a > 10 and b < 10:
       # condition confusing but at least explicit
   else:
       # Exactly what is true here?
       # Can be hard to reason out what condition is true

দু'বার ভাবুন else:। এটি সাধারণত একটি সমস্যা। এটি কোনও ifস্টেটমেন্ট বাদে এড়িয়ে চলুন এবং তারপরেও elseএটিকে স্পষ্ট করার জন্য - শর্তটি নথিভুক্ত করার বিষয়টি বিবেচনা করুন ।


6
আমি এই এক সাথে একমত হবে। "If-elif" ব্লকে, "অন্য" টি "ডিফল্ট" হিসাবে ব্যবহৃত হয় সি ভাষার "কেস" ব্লকে ব্যবহৃত হত। আপনি সর্বদা বিভিন্ন অবস্থাতে সমস্ত ঘটনা কভার করেছেন বলে মনে করে এমনকি "ডিফল্ট" কেস হ্যান্ডেল করার জন্য সর্বদা সুপারিশ করা হয়।
জোসিপ

1
@ জোসিপ: "ডিফল্ট" হিসাবে ব্যবহৃত বিভ্রান্তিকর হতে পারে। ইস্যুটি স্পষ্টভাবে শর্তটি নির্ধারণ করে যে এটি এই "ডিফল্ট"। একটি দুর্বল-সংজ্ঞায়িত ডিফল্ট শর্তটি বাগি আচরণের মূল কারণ হতে পারে। অন্যথায় বিভ্রান্তির কারণ হতে পারে। এটি সব ক্ষেত্রে খুব সাবধানতার সাথে চিন্তা করা উচিত, কেবল চেষ্টা করার জন্য নয়, তবে এবং যদি তা হয় তবে।
এস .লট

5
ঠিক আছে, উপরের কোডটি সম্পূর্ণ বিমূর্ত এবং অর্থবহ কিছু করে না, তাই হ্যাঁ - এটি বিভ্রান্ত হওয়ার মতোই নয়।
জুলস

1
@ এসলট "এটি বগিটি হ্রাস করবে" - এবং আমার বক্তব্যটি এটি মিথ্যা। আমি মনে করি আমাদের মতামতের মধ্যে কেবল আসল পার্থক্য রয়েছে। খারাপ প্রোগ্রামাররা সর্বদা বগি প্রোগ্রাম লেখার উপায়গুলি সন্ধান করে। সর্বদা. ভাল প্রোগ্রামাররা সর্বদা ভাল অনুশীলনগুলি সন্ধান করে এবং যে কোনও ভাষায় ভাল কোড লিখতে পারে। দরকারী কনস্ট্রাক্টস নির্মূল করা ভাল প্রোগ্রামারগুলিকে কেবলমাত্র কম শক্তি দেয় যখন বিশেষত খারাপগুলি খুঁজে বের করতে সহায়তা করে না কারণ এগুলি চ ** কে জিনিসগুলি আপ করার জন্য অসীম সংখ্যক উপায় আবিষ্কার করতে সক্ষম।
julx

5
বিবেচনা করুন: if x > 0: return "yes"এবং if x <= 0: return "no"। এখন একজন ব্যক্তি এসে কথায় কথায় x > 1একটি পরিবর্তন করে তবে অন্যটিকে পরিবর্তন করতে ভুলে যায়। প্রতিশ্রুতিবদ্ধ হবে যে বাগ সংখ্যা হ্রাস কিভাবে। if elseধারা কখনও কখনও অনেক লাইন পৃথক হয়। ডিআরওয়াই একটি ভাল অনুশীলন, প্রায়শই না আসলেই সত্য। (ডাবল পোস্টের জন্য দুঃখিত)
julx
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.