পাইথন ব্যতিক্রম বার্তা ক্যাপচার


519
import ftplib
import urllib2
import os
import logging
logger = logging.getLogger('ftpuploader')
hdlr = logging.FileHandler('ftplog.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
FTPADDR = "some ftp address"

def upload_to_ftp(con, filepath):
    try:
        f = open(filepath,'rb')                # file to send
        con.storbinary('STOR '+ filepath, f)         # Send the file
        f.close()                                # Close file and FTP
        logger.info('File successfully uploaded to '+ FTPADDR)
    except, e:
        logger.error('Failed to upload to ftp: '+ str(e))

এটি কাজ করে বলে মনে হচ্ছে না, আমি সিনট্যাক্স ত্রুটি পেয়েছি, কোনও ফাইলে সমস্ত ধরণের ব্যতিক্রম লগ করার জন্য এটি করার সঠিক উপায় কী?


2
আপনার ইন্ডেন্টেশনটি নষ্ট হয়ে গেছে। এবং ,পরে বাদ দিন except
সোভেন মারনাচ

3
@ স্পেনমার্নাচ, আপনি যদি ,পরে বাদ দেন তবে আপনি exceptপাবেন global name 'e' is not definedযা ভুল বাক্য বিন্যাসের চেয়ে বেশি ভাল নয়।
Val,

12
@ ভ্যাল: পাইথন সংস্করণের উপর নির্ভর করে except Exception as eবা হওয়া উচিত except Exception, e
সোভেন মারনাচ

1
সম্ভবত এটি 8 টি উত্তরের কোথাও কোথাও না, তবে আপনি যখন কোনও ফাইল খোলেন তখন নিকটতম অংশটি কখনও চেষ্টা করার বিবৃতিতে থাকা উচিত নয়, তবে হয় শেষের বিবৃতিতে বা বিবৃতি দিয়ে মোড়ানো।
জে.সি. রোকমন্ডে

উত্তর:


732

কোন ধরণের ব্যতিক্রম আপনি ধরতে চান তা আপনাকে নির্ধারণ করতে হবে। সুতরাং সাধারণ ব্যতিক্রমের except Exception, e:পরিবর্তে লিখুন except, e:(এটি যে কোনওভাবে লগ হবে)।

অন্য সম্ভাবনাটি হ'ল কোডটি ব্যতীত আপনার সম্পূর্ণ চেষ্টাটি লিখুন:

try:
    with open(filepath,'rb') as f:
        con.storbinary('STOR '+ filepath, f)
    logger.info('File successfully uploaded to '+ FTPADDR)
except Exception, e: # work on python 2.x
    logger.error('Failed to upload to ftp: '+ str(e))

পাইথন ৩.x এবং পাইথন ২.x এর আধুনিক সংস্করণগুলির except Exception as eপরিবর্তে except Exception, e:

try:
    with open(filepath,'rb') as f:
        con.storbinary('STOR '+ filepath, f)
    logger.info('File successfully uploaded to '+ FTPADDR)
except Exception as e: # work on python 3.x
    logger.error('Failed to upload to ftp: '+ str(e))

118
repr (e) আপনাকে ব্যতিক্রম দেয় (এবং বার্তার স্ট্রিং); str (e) কেবল বার্তাটির স্ট্রিং দেয়।
হোয়াইটবার্ড

11
লগিং ব্যতিক্রমের বিকল্প হিসাবে আপনি এর logger.exception(e)পরিবর্তে ব্যবহার করতে পারেন । এটি একই logging.ERRORস্তরে ট্রেসব্যাক দিয়ে ব্যতিক্রমটি লগ করবে ।
এমবিদেপল

1
@mbdevpl- কে এটি সত্য বলে মনে হচ্ছে না। এটি ব্যতিক্রমটিতে স্ট্রিং
কেভিনআর

6
except Exception, e:পাইথন 3 এ আমার কাছে সিন্ট্যাক্স ত্রুটি ছুড়ে দেয় this এটি কি প্রত্যাশিত?
চার্লি পার্কার 4

27
পাইথন 3-এ চার্লিপার্কার লিখুনexcept Exception as e:
ইউরোমো

281

বাক্য গঠনটি আর অজগর 3 তে সমর্থিত নয় পরিবর্তে নিম্নলিখিতটি ব্যবহার করুন।

try:
    do_something()
except BaseException as e:
    logger.error('Failed to do something: ' + str(e))

2
প্রকৃতপক্ষে, আপনাকে লগার.অরর ব্যবহার করা উচিত ('কিছু করতে ব্যর্থ:% s', টিআর (ই)) এইভাবে, যদি আপনার লগার স্তর ত্রুটির উপরে থাকে তবে এটি স্ট্রিং ইন্টারপোলেশনটি করে না।
avyfain

7
@avyfain - আপনি ভুল বিবৃতি logging.error('foo %s', str(e))সর্বদা eএকটি স্ট্রিতে রূপান্তরিত হবে । আপনি পরবর্তী সময়ে যা ব্যবহার করবেন তা অর্জন করতে logging.error('foo %s', e)- এর ফলে লগিং ফ্রেমওয়ার্কটি রূপান্তর করতে (বা না) করার অনুমতি দেয়।
রন ডাহলগ্রেন

1
আপনি পাইথন আরপিএলে যাচাই করতে পারেন (পাইথন ৩.৩.২ এবং আইপথন সহ এখানে): আমার
রন ডাহলগ্রেন

2
লগিং ব্যতিক্রমের বিকল্প হিসাবে আপনি এর logger.exception(e)পরিবর্তে ব্যবহার করতে পারেন । এটি একই logging.ERRORস্তরে ট্রেসব্যাক দিয়ে ব্যতিক্রমটি লগ করবে ।
mbdevpl

11
সাবধান except BaseExceptionএবং except Exceptionএকই স্তরে না। except Exceptionপাইথন 3 এ কাজ করে তবে এটি KeyboardInterruptউদাহরণস্বরূপ ধরা পড়বে না (যা আপনি যদি আপনার কোডটিতে বাধা দিতে চান তবে খুব সুবিধাজনক হতে পারে!), যেখানে BaseExceptionকোনও ব্যতিক্রম ধরা পড়ে। ব্যতিক্রম শ্রেণিবিন্যাসের জন্য এই লিঙ্কটি দেখুন ।
jeannej

41

লগারের জন্য সহজ কিছুতে এটি আপডেট করা (পাইথন 2 এবং 3 উভয়ের জন্য কাজ করে)। আপনার ট্রেসব্যাক মডিউলটির দরকার নেই।

import logging

logger = logging.Logger('catch_all')

def catchEverythingInLog():
    try:
        ... do something ...
    except Exception as e:
        logger.error(e, exc_info=True)
        ... exception handling ...

এটি এখন পুরানো উপায় (যদিও এখনও কাজ করে):

import sys, traceback

def catchEverything():
    try:
        ... some operation(s) ...
    except:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        ... exception handling ...

exc_value হচ্ছে ত্রুটি বার্তা।


2
এটি আমার পছন্দের পদ্ধতি হবে। আমি মনে করি স্ট্রিং প্রিন্ট করা লগিংয়ের জন্য দরকারী তবে আমার যদি সেই তথ্য দিয়ে কিছু করতে হয় তবে আমার কেবল স্ট্রিংয়ের চেয়ে বেশি প্রয়োজন।
সুলিম্মেশ

3
দ্বিতীয় উদাহরণে আপনার 'আমদানি ট্রেসব্যাক' করার দরকার নেই, তাই না?
স্টারিকফ

35

কিছু ক্ষেত্রে রয়েছে যেখানে আপনি e.message বা e.messages ব্যবহার করতে পারেন .. তবে এটি সব ক্ষেত্রে কার্যকর হয় না। যাইহোক আরও নিরাপদ স্ট্র (ই) ব্যবহার করা

try:
  ...
except Exception as e:
  print(e.message)

42
এই সঙ্গে সমস্যা, উদাহরণস্বরূপ, যদি আপনি except Exception as eএবং eএকটি হয় IOError, আপনি পেতে e.errno, e.filenameএবং e.strerror, কিন্তু দৃশ্যত কোন e.message(পাইথন অন্তত 2.7.12)। আপনি যদি ত্রুটি বার্তাটি ক্যাপচার করতে চান str(e)তবে অন্যান্য উত্তরের মতো ব্যবহার করুন ।
এপলাম

@ পেলম যদি আপনি ব্যতিক্রমের আগে আইওআরার ধরেন?
অ্যালবার্ট থম্পসন

@ হেরিবার্টোজুয়েরেজ আপনি কেবল স্ট্রিংয়ে ফেলে দিতে গিয়ে কেন বিশেষ মামলাগুলি ধরেন?
হোসেইএনজেএফ

25

আপনি যদি ত্রুটি শ্রেণি, ত্রুটি বার্তা এবং স্ট্যাক ট্রেস (বা এর মধ্যে কিছু) চান তবে ব্যবহার করুন sys.exec_info()

কিছু বিন্যাস সহ নূন্যতম ওয়ার্কিং কোড:

import sys
import traceback

try:
    ans = 1/0
except BaseException as ex:
    # Get current system exception
    ex_type, ex_value, ex_traceback = sys.exc_info()

    # Extract unformatter stack traces as tuples
    trace_back = traceback.extract_tb(ex_traceback)

    # Format stacktrace
    stack_trace = list()

    for trace in trace_back:
        stack_trace.append("File : %s , Line : %d, Func.Name : %s, Message : %s" % (trace[0], trace[1], trace[2], trace[3]))

    print("Exception type : %s " % ex_type.__name__)
    print("Exception message : %s" %ex_value)
    print("Stack trace : %s" %stack_trace)

যা নিম্নলিখিত ফলাফল দেয়:

Exception type : ZeroDivisionError
Exception message : division by zero
Stack trace : ['File : .\\test.py , Line : 5, Func.Name : <module>, Message : ans = 1/0']

Sys.exc_info () ফাংশনটি আপনাকে সর্বাধিক সাম্প্রতিক ব্যতিক্রম সম্পর্কিত বিশদ দেয়। এটি একটি tuple ফেরত (type, value, traceback)

tracebackট্রেসব্যাক অবজেক্টের উদাহরণ। আপনি প্রদত্ত পদ্ধতিগুলির সাহায্যে ট্রেসটিকে বিন্যাস করতে পারেন। ট্রেসব্যাক ডকুমেন্টেশনে আরও পাওয়া যাবে ।


3
ব্যবহার e.__class__.__name__ ব্যতিক্রম পাশাপাশি ক্লাস ফিরে আসতে পারে।
কেনোরব

19

আপনি logger.exception("msg")ট্রেসব্যাক সহ লগিং ব্যতিক্রমের জন্য ব্যবহার করতে পারেন :

try:
    #your code
except Exception as e:
    logger.exception('Failed: ' + str(e))

কাকতালীয়ভাবে, e.msgএটি Exceptionশ্রেণীর স্ট্রিং প্রতিনিধিত্ব ।
মার্কহু

5
বা সহজভাবে logger.exception(e)
mbdevpl


5

আপনি বেসএক্সেপশন প্রকারটি স্পষ্টভাবে উল্লেখ করার চেষ্টা করতে পারেন। তবে এটি কেবল বেসএক্সেপশনের ডেরিভেটিভসকেই ধরবে। যদিও এতে সমস্ত বাস্তবায়ন-সরবরাহিত ব্যতিক্রমগুলি অন্তর্ভুক্ত রয়েছে তবে এটি স্বেচ্ছাসেবী পুরানো শৈলীর ক্লাসগুলি বাড়ানোও সম্ভব।

try:
  do_something()
except BaseException, e:
  logger.error('Failed to do something: ' + str(e))


2

ভবিষ্যতের সংগ্রামকারীদের জন্য অজগর ৩.৮.২ (এবং সম্ভবত এর কিছু সংস্করণ আগে) সিনট্যাক্সটি

except Attribute as e:
    print(e)

1

ব্যতিক্রমটি ব্যবহার str(e)বা repr(e)প্রতিনিধিত্ব করার জন্য, আপনি প্রকৃত স্ট্যাক ট্রেস পাবেন না, তাই ব্যতিক্রমটি কোথায় তা খুঁজে পাওয়া সহায়ক নয়।

অন্যান্য উত্তর এবং লগিং প্যাকেজ ডকটি পড়ার পরে, নিম্নোক্ত দুটি উপায় সহজ ডিবাগিংয়ের জন্য প্রকৃত স্ট্যাক ট্রেস মুদ্রণের জন্য দুর্দান্ত কাজ করে:

logger.debug()পরামিতি সঙ্গে ব্যবহার করুনexc_info

try:
    # my code
exception SomeError as e:
    logger.debug(e, exc_info=True)

ব্যবহার logger.exception()

বা আমরা সরাসরি logger.exception()ব্যতিক্রম মুদ্রণ করতে ব্যবহার করতে পারেন ।

try:
    # my code
exception SomeError as e:
    logger.exception(e)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.