পাইথনে, কেউ কীভাবে সতর্কতাগুলি ব্যতিক্রম হিসাবে ধরবে?


111

একটি তৃতীয় পক্ষের গ্রন্থাগার (সি তে লিখিত) আমি আমার অজগর কোডটিতে সতর্কতা জারি করছি। আমি try exceptএই সতর্কতাগুলি সঠিকভাবে পরিচালনা করতে সিনট্যাক্সটি ব্যবহার করতে সক্ষম হতে চাই । এই কাজ করতে একটি উপায় আছে কি?


4
এই সতর্কতাগুলি কি কেবল পাঠানো বার্তাগুলি লেখা হয় স্ট্যাডার?
ফেনিকসো

4
ফেনিকসো: আমি নিশ্চিতভাবে জানি না, বাস্তব সতর্কতার মতো মনে হচ্ছে
বোরিস গোরালিক

4
আপনি কীভাবে "আসল সতর্কতা" চিনবেন? আমি ভেবেছিলাম যে সি তে আপনি কম্পাইল করার সময় সত্যিকারের সতর্কতা পাবেন।
ফেনিকসো

warnings.filterwarningsআপনি যা চান ঠিক তাই করেন, এটির সাথে আপনার সমস্যাটি কী তা আমি বুঝতে পারি না?
রোশ অক্সিমারন

4
@ ফেনিক্সো, @ রোশ অক্সিমারন আপনি ঠিক বলেছেন। আমার ভুল. warnings.filterwarnigns('error')কাজ করে এই সমাধানটির প্রস্তাব দেওয়া মূল উত্তরটি আমি খুঁজে পাচ্ছি না
বোরিস গোরালিক

উত্তর:


53

পাইথন হ্যান্ডবুক থেকে উদ্ধৃতি ( 27.6.4। পরীক্ষার সতর্কতা ):

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)

6
এখানে একটি উত্তর দেওয়া হয়েছে, এটি আপনাকে try exceptসিনট্যাক্সটি কীভাবে ব্যবহার করবেন তা বলে tells
আনপিডের

নিকাসের উত্তরের সাথে এর সুবিধা রয়েছে, যে কোনও fnxকিছু ফিরিয়ে দিলে আপনি সেই ফলাফলটি রাখেন (এবং এখনও সতর্কতাটি পরিচালনা করতে পারেন)।
পিয়েট্রো ব্যাটিস্টন

এটি ওপির প্রশ্নের উত্তর দেয় না, যা ওয়ানআরিংগুলি পরিচালনা করার বিষয়ে ছিল, তাদের পরীক্ষা না করে। তবে নীচের নীচের উত্তরগুলি কীভাবে সতর্কতাগুলি পরিচালনা করবে তা দেখায়।
বিগসি

কেবলমাত্র একটি নোট যে উপরের ফাংশনটি কাজ করবে না যদি আপনার ফাংশন মাঝেমধ্যে একটি সতর্কতা ফেরত দেয় কারণ ইভেন্টে যদি fxn()কোনও সতর্কতা ফিরে না আসে তবে wখালি তালিকা হবে। যদি wএকটি খালি তালিকা (অর্থাৎ []), তারপর কোড চালনাকারী আপনি নিম্নলিখিত ত্রুটির দিতে হবে: IndexError: list index out of range। আপনি যদি কেবল ধরা পড়া সতর্কতাগুলির বৈশিষ্ট্যগুলি ফর্ম্যাট করতে বা এটির জন্য অনুসন্ধান করতে চান তবে একটি লুপ ব্যবহার করা ভাল:for x in w: print(f'{x.category.__name__}: {str(x.message)}')
স্টিভেন এম মর্টিমার

134

সতর্কতাগুলি ত্রুটি হিসাবে পরিচালনা করতে কেবল এটি ব্যবহার করুন:

import warnings
warnings.filterwarnings("error")

এর পরে আপনি ত্রুটিগুলির মতো সতর্কতাগুলি ধরতে সক্ষম হবেন, যেমন এটি কাজ করবে:

try:
    some_heavy_calculations()
except RuntimeWarning:
    import ipdb; ipdb.set_trace()

PS এই উত্তরটি যুক্ত করেছে কারণ মন্তব্যে সেরা উত্তরে ভুল বানান রয়েছে: filterwarnignsপরিবর্তে filterwarnings


8
এবং আপনি যদি কেবল স্ট্যাক ট্রেস দেখতে চান তবে প্রথম দুটি লাইন আপনার যা প্রয়োজন তা হ'ল।
z0r

5
এটি নিখুঁত। আমি কেবল চেয়েছিলাম যে আমার স্ক্রিপ্টটি সতর্কতা জারি হওয়ার সাথে সাথেই সম্পাদন বন্ধ করা উচিত, যাতে আমি প্রাসঙ্গিক ডিবাগের তথ্য মুদ্রণ করতে এবং সমস্যার সমাধান করতে পারি।
প্রবীণ

4
কমপক্ষে অজগর ৩. filterwarningsধরার জন্য আপনাকে কলটির দরকার নেই Warningsএটি কেবল কার্যকর।
nnot101

4
গৃহীত উত্তরটি ওপি-র প্রশ্নের উত্তর দেয় না। এই উত্তর দেয়। আমার অনুসন্ধানে যখন এই প্রশ্নটি পেল তখন এটিই আমি উত্তরটি খুঁজছিলাম।
বিগসি

সমস্ত সতর্কতাগুলিকে ত্রুটিগুলিতে রূপান্তর করা যদি আপনি এটিকে বৃহত্তর স্ক্রিপ্ট বা সফ্টওয়্যার প্যাকেজের মধ্যে ব্যবহার করেন তবে সহজেই সমস্যাযুক্ত হয়ে উঠতে পারে। জিনিসগুলিও ডিবাগ করা খুব কঠিন করে তুলতে পারে
বেন জেফ্রি

16

এখানে একটি প্রকরণ যা কেবলমাত্র আপনার কাস্টম সতর্কতার সাথে কীভাবে কাজ করবে তা পরিষ্কার করে দেয়।

import warnings
with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")

    # Call some code that triggers a custom warning.
    functionThatRaisesWarning()

    # ignore any non-custom warnings that may be in the list
    w = filter(lambda i: issubclass(i.category, UserWarning), w)

    if len(w):
        # do something with the first warning
        email_admins(w[0].message)

16

আপনি যদি চান কেবলমাত্র আপনার সতর্কবাণীতে স্ক্রিপ্টটি ব্যর্থ হয় তবে আপনি যুক্তিpython দিয়ে ডাকতে পারেন :-W

python -W error foobar.py

4

কিছু ক্ষেত্রে সতর্কতাগুলিকে ত্রুটিতে পরিণত করতে আপনার টাইপ ব্যবহার করতে হবে। উদাহরণ স্বরূপ:

str(b'test')  # no error
import warnings
warnings.simplefilter('error', BytesWarning)
str(b'test')  # still no error
import ctypes
ctypes.c_int.in_dll(ctypes.pythonapi, 'Py_BytesWarningFlag').value = 2
str(b'test')  # this raises an error

এই উত্তরটি কেবলমাত্র নির্দিষ্ট সতর্কতার ধরণের ক্ষেত্রে কীভাবে ত্রুটি করা যায় তা দেখানোর জন্য গঠনমূলক। প্রায় কোনও বৃহত সফ্টওয়্যার প্রকল্পের জন্য, আপনি যদি warnings.simplefilter('error')লগগুলিতে দেখেছেন এমন সতর্কতার জন্য ট্রেসব্যাক পাবেন না, তবে আগের ফিল্টার করা সতর্কতা থেকে ট্র্যাসব্যাক পাবেন। ব্যবহার simplefilterএছাড়াও যদি আপনি কিছু CLI আবাহন আছে আপনার উত্তর উতরান থেকে দ্রুততম উপায়।
অ্যালানসিতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.