в чем разница между текущей попыткой - кроме python? [Дубликат]

Используйте эту функцию для изменения времени системы (проверено в окне 8)

 void setDate(string dateInYourSystemFormat)
    {
        var proc = new System.Diagnostics.ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = @"C:\Windows\System32";
        proc.CreateNoWindow = true;
        proc.FileName = @"C:\Windows\System32\cmd.exe";
        proc.Verb = "runas";
        proc.Arguments = "/C date " + dateInYourSystemFormat;
        try
        {
            System.Diagnostics.Process.Start(proc);
        }
        catch
        {
            MessageBox.Show("Error to change time of your system");
            Application.ExitThread();
        }
    }
void setTime(string timeInYourSystemFormat)
    {
        var proc = new System.Diagnostics.ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = @"C:\Windows\System32";
        proc.CreateNoWindow = true;
        proc.FileName = @"C:\Windows\System32\cmd.exe";
        proc.Verb = "runas";
        proc.Arguments = "/C time " + timeInYourSystemFormat;
        try
        {
            System.Diagnostics.Process.Start(proc);
        }
        catch
        {
            MessageBox.Show("Error to change time of your system");
            Application.ExitThread();
        }
    }

Пример: вызов метода загрузки формы setDate («5-6-92»); setTime ("2: 4: 5 AM");

257
задан Hellnar 14 January 2011 в 12:33
поделиться

10 ответов

Вы должны определить, какой тип исключения вы хотите поймать. Поэтому напишите except Exception, e: вместо except, e: для общего исключения (которое будет регистрироваться в любом случае).

Другая возможность состоит в том, чтобы написать весь ваш код try / except:

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

в Python 3.x и современные версии Python 2.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:
    logger.error('Failed to upload to ftp: '+ str(e))
318
ответ дан MaxU 18 August 2018 в 07:47
поделиться
  • 1
    repr (e) дает вам исключение (и строку сообщения); str (e) дает только строку сообщения. – whitebeard 30 July 2016 в 11:28
  • 2
    В качестве альтернативы для исключения регистрации вы могли бы использовать logger.exception(e). Он будет регистрировать исключение с трассировкой на том же уровне logging.ERROR. – mbdevpl 31 August 2016 в 09:50
  • 3
    @mbdevpl это не похоже на правду. Похоже, что вызывается str () для исключения: ideone.com/OaCOpO – KevinOrr 4 October 2016 в 20:08
  • 4
    except Exception, e: выдает мне синтаксическую ошибку в python 3. Ожидается ли это? – Charlie Parker 1 November 2017 в 05:12
  • 5
    @CharlieParker в Python3 напишите except Exception as e: – eumiro 1 November 2017 в 06:38

Обновление этого для чего-то более простого для регистратора (работает как для python 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 - это сообщение об ошибке.

23
ответ дан berniey 18 August 2018 в 07:47
поделиться
  • 1
    Это был бы мой предпочтительный метод. Просто печатать строку полезно для ведения журнала, я полагаю, но если мне нужно что-либо сделать с этой информацией, мне нужно больше, чем просто строка. – skeletalbassman 30 March 2016 в 18:31
  • 2

Вы можете явно указать тип BaseException. Тем не менее, это будет только улавливать производные BaseException. Хотя это включает все исключения для реализации, также возможно поднять произвольные классы старого стиля.

try:
  do_something()
except BaseException, e:
  logger.error('Failed to do something: ' + str(e))
3
ответ дан Heini Høgnason 18 August 2018 в 07:47
поделиться

Если вам нужен класс ошибок, сообщение об ошибке и трассировка стека (или любой из них), используйте 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.exec_info ()

Это дает вам сведения об исключении из последнего исключения. Он возвращает кортеж. Ниже приведены значения кортежа (type, value, traceback).

traceback - это экземпляр объекта трассировки. Вы можете отформатировать трассировку с помощью предоставленных методов. Подробнее можно узнать из документации о трассировке

2
ответ дан Kavindu Dodanduwa 18 August 2018 в 07:47
поделиться
  • 1
    Использование e.__class__.__name__ также может вернуть класс исключения. – kenorb 14 June 2018 в 20:13

Использовать str (ex) для печати исключения

try:
   #your code
except ex:
   print(str(ex))
0
ответ дан Niraj Trivedi 18 August 2018 в 07:47
поделиться

Вы можете использовать logger.exception("msg") для исключения журнала с трассировкой:

try:
    #your code
except Exception as e:
    logger.exception('Failed: ' + str(e))
13
ответ дан Peter 18 August 2018 в 07:47
поделиться
  • 1
    По совпадению, e.msg является строковым представлением класса Exception. – MarkHu 3 March 2016 в 21:54
  • 2
    Или просто logger.exception(e). – mbdevpl 31 August 2016 в 09:52

Синтаксис больше не поддерживается в python 3. Используйте вместо этого следующее.

try:
    do_something()
except BaseException as e:
    logger.error('Failed to do something: ' + str(e))
212
ответ дан sjtaheri 18 August 2018 в 07:47
поделиться
  • 1
    Спасибо за то, что похоже на единственное объяснение этого для Python 3. Два года спустя. – user9993 28 November 2015 в 21:17
  • 2
    На самом деле, вы должны использовать logger.error («Не удалось что-то сделать:% s», str (e)) Таким образом, если ваш уровень регистратора выше ошибки, он не выполняет интерполяцию строк. – avyfain 25 February 2016 в 00:19
  • 3
    @avyfain - Вы ошибаетесь. Оператор logging.error('foo %s', str(e)) всегда будет преобразовывать e в строку. Для достижения того, что вы используете, вы будете использовать logging.error('foo %s', e), тем самым позволяя системе ведения журналов делать (или не делать) преобразование. – Ron Dahlgren 11 July 2016 в 23:29
  • 4
    Вы уверены в этом @RonDahlgren? У меня создалось впечатление, что logging.error('message %s', expression) лениво оценивается независимо от выражения и только интерполирует строку, если на самом деле журнал будет выводиться в любом месте. – avyfain 12 July 2016 в 03:56
  • 5
    Вы можете проверить в REPL Python (здесь с Python 3.5.2 и ipython): см. Мой смысл здесь – Ron Dahlgren 12 July 2016 в 15:27
  • 6

В некоторых случаях вы можете использовать e.message или e.messages. Но это не работает во всех случаях. В любом случае более безопасным является использование str (e)

try:
  ...
except Exception as e:
  print(e.message)
20
ответ дан Slipstream 18 August 2018 в 07:47
поделиться
  • 1
    Проблема с этим, например, если вы except Exception as e и e являются IOError, вы получаете e.errno, e.filename и e.strerror, но, по-видимому, нет e.message (по крайней мере, в Python 2.7.12). Если вы хотите записать сообщение об ошибке, используйте str(e), как в других ответах. – epalm 19 April 2017 в 18:28
0
ответ дан Chuan Ma 6 September 2018 в 21:10
поделиться
2
ответ дан Chuan Ma 30 October 2018 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: