多个Try-Excepts后跟pyse中的Else

Ell*_*iot 4 python exception-handling

有没有办法让几个连续的Try-Except子句只有在所有这些子句成功的情况下触发一个Else?

举个例子:

 try:
    private.anodization_voltage_meter = Voltmeter(voltage_meter_address.value) #assign voltmeter location
except(visa.VisaIOError): #channel time out
    private.logger.warning('Volt Meter is not on or not on this channel')
try:
    private.anodization_current_meter = Voltmeter(current_meter_address.value) #assign voltmeter as current meter location
except(visa.VisaIOError): #channel time out
    private.logger.warning('Ammeter is not on or not on this channel')
try:
    private.sample_thermometer = Voltmeter(sample_thermometer_address.value)#assign voltmeter as thermomter location for sample.
except(visa.VisaIOError): #channel time out
    private.logger.warning('Sample Thermometer is not on or not on this channel')
try:
    private.heater_thermometer = Voltmeter(heater_thermometer_address.value)#assign voltmeter as thermomter location for heater.
except(visa.VisaIOError): #channel time out
    private.logger.warning('Heater Thermometer is not on or not on this channel')
else:
    private.logger.info('Meters initialized')
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,meters initialized如果所有这些都已关闭,您只想打印,但是如目前所写,它仅取决于加热器温度计.有没有办法堆叠这些?

Ign*_*ams 6

考虑将try/except结构分解为一个函数,该函数True在调用有效时返回,False如果失败,则使用eg all()来查看它们都成功:

def initfunc(structure, attrname, address, desc):
  try:
    var = Voltmeter(address.value)
    setattr(structure, attrname, var)
    return True
  except(visa.VisaIOError):
    structure.logger.warning('%s is not on or not on this channel' % (desc,))

if all([initfunc(*x) for x in [(private, 'anodization_voltage_meter', voltage_meter_address, 'Volt Meter'), ...]]):
  private.logger.info('Meters initialized')
Run Code Online (Sandbox Code Playgroud)


ric*_*cho 6

就个人而言,我只是有一个旅行变量init_ok或某些东西.

将其设置为True,并将所有except子句设置为False,然后在最后测试?


Joh*_*ooy 6

尝试这样的事情.保持在第一个异常后不停止的原始行为

success = True
for meter, address, message in (
        ('anodization_voltage_meter',voltage_meter_address,'Volt Meter is not on or not on this channel'),
        ('anodization_current_meter',current_meter_address,'Ammeter is not on or not on this channel'),
        ('sample_thermometer',sample_thermometer_address,'Sample Thermometer is not on or not on this channel'),
        ('heater_thermometer',heater_thermometer_address,'Heater Thermometer is not on or not on this channel')):
   try:
       setattr(private,meter, Voltmeter(address.value):
   except (visa.VisaIOError,):
       success = False
       private.logger.warning(message)

if success: # everything is ok
    private.logger.info('Meters initialized')
Run Code Online (Sandbox Code Playgroud)