выдает Исключение в наконец блоках

Вы можете использовать pd.concat с groupby и использовать пользовательскую функцию для заполнения логики:

# convert to numeric
df['Number'] = pd.to_numeric(df['Number'])

# assign values by index
def filler(x):
    idx = np.where(x['Number'].notnull())[0]
    x.iloc[:idx[0], -2:] = ['1. Too Low', 1]
    x.iloc[idx[-1]+1:, -2:] = ['3. Too High', 3]
    return x

# concatenate transformed dataframe slices
res = pd.concat(df_slice.pipe(filler) for _, df_slice in df.groupby('Department'))

Результат:

print(res)

      Department     Range        Rating  Number
0          Admin  0 (None)    1. Too Low     1.0
1          Admin   01 to 3    1. Too Low     1.0
2          Admin   01 to 3    1. Too Low     1.0
3          Admin   01 to 3    1. Too Low     1.0
4          Admin   04 to 6  2. On Target     2.0
5          Admin   04 to 6  2. On Target     2.0
6          Admin   04 to 6  2. On Target     2.0
7          Admin  07 to 10   3. Too High     3.0
8          Admin  07 to 10   3. Too High     3.0
9          Admin  07 to 10   3. Too High     3.0
10         Admin  07 to 10   3. Too High     3.0
11  Distribution  0 (None)    1. Too Low     1.0
12  Distribution   01 to 3    1. Too Low     1.0
13  Distribution   01 to 3    1. Too Low     1.0
14  Distribution   01 to 3    1. Too Low     1.0
15  Distribution   04 to 6  2. On Target     2.0
16  Distribution   04 to 6  2. On Target     2.0
17  Distribution   04 to 6  2. On Target     2.0
18  Distribution  07 to 10   3. Too High     3.0
19  Distribution  07 to 10   3. Too High     3.0
20  Distribution  07 to 10   3. Too High     3.0
21  Distribution  07 to 10   3. Too High     3.0
99
задан bluish 22 November 2012 в 09:54
поделиться

8 ответов

Я обычно делаю это как это:

try {
  // Use the resource.
} catch( Exception ex ) {
  // Problem with the resource.
} finally {
  // Put away the resource.
  closeQuietly( resource );
}

В другом месте:

protected void closeQuietly( Resource resource ) {
  try {
    if (resource != null) {
      resource.close();
    }
  } catch( Exception ex ) {
    log( "Exception during Resource.close()", ex );
  }
}
71
ответ дан Dave Jarvis 24 November 2019 в 05:05
поделиться
try {
    final Resource resource = acquire();
    try {
        use(resource);
    } finally {
        resource.release();
    }
} catch (ResourceException exx) {
    ... sensible code ...
}

сделанный Job. Никакие пустые тесты. Единственная выгода, включайте, получают и выпускают исключения. Конечно, можно использовать Выполнение Вокруг идиомы и только иметь для записи этого однажды для каждого типа ресурса.

0
ответ дан Tom Hawtin - tackline 24 November 2019 в 05:05
поделиться

Я обычно делаю это:

MyResource r = null;
try { 
   // use resource
} finally {   
    if( r != null ) try { 
        r.close(); 
    } catch( ThatSpecificExceptionOnClose teoc ){}
}

Объяснение: Если я сделан с ресурсом и единственной проблемой, я имею, закрывает его, нет очень, я могу делать с этим. Не имеет смысла ни один уничтожать целый поток, если я сделан с ресурсом так или иначе.

Это - один из случаев, когда, по крайней мере, для меня, безопасно проигнорировать ту контролируемую исключительную ситуацию.

По сей день у меня не было проблемы с помощью этой идиомы.

0
ответ дан OscarRyz 24 November 2019 в 05:05
поделиться

Вы могли осуществить рефакторинг это в другой метод...

public void RealDoSuff()
{
   try
   { DoStuff(); }
   catch
   { // resource.close failed or something really weird is going on 
     // like an OutOfMemoryException 
   }
}

private void DoStuff() 
{
  try 
  {}
  catch
  {
  }
  finally 
  {
    if (resource != null) 
    {
      resource.close(); 
    }
  }
}
0
ответ дан Sam Saffron 24 November 2019 в 05:05
поделиться

Если Вы можете, необходимо протестировать для предотвращения состояния ошибки для начала.

try{...}
catch(NullArgumentException nae){...}
finally
{
  //or if resource had some useful function that tells you its open use that
  if (resource != null) 
  {
      resource.Close();
      resource = null;//just to be explicit about it was closed
  }
}

Также необходимо, вероятно, только ловить исключения, с которых можно восстановиться, если Вы не можете восстановиться, затем позволяют ему распространить к верхнему уровню Вашей программы. Если Вы не можете протестировать на состояние ошибки, что необходимо будет окружить код блоком выгоды попытки как Вы, уже сделали (хотя я рекомендовал бы все еще ловить определенные, ожидаемые погрешности).

0
ответ дан Ken Henderson 24 November 2019 в 05:05
поделиться

Почему Вы хотите избежать дополнительного блока? Начиная с наконец блок содержит "нормальные" операции, которые могут выдать исключение, И Вы хотите наконец блок работать полностью, необходимо поймать исключения.

, Если Вы не ожидаете наконец блок выдавать исключение и Вы не знаете, как обработать исключение так или иначе (Вы просто вывели бы отслеживание стека), позволяют пузырю исключения стек вызовов (удалите выгоду попытки из наконец блок).

, Если Вы хотите уменьшить ввод Вас, мог бы реализовать "глобальный" внешний блок try-catch, который поймает все исключения, добавленные наконец блоки:

try {
    try {
        ...
    } catch (Exception ex) {
        ...
    } finally {
        ...
    }

    try {
        ...
    } catch (Exception ex) {
        ...
    } finally {
        ...
    }

    try {
        ...
    } catch (Exception ex) {
        ...
    } finally {
        ...
    }
} catch (Exception ex) {
    ...
}
1
ответ дан Eduard Wirch 24 November 2019 в 05:05
поделиться

Я обычно использую один из эти closeQuietly методы в org.apache.commons.io.IOUtils:

public static void closeQuietly(OutputStream output) {
    try {
        if (output != null) {
            output.close();
        }
    } catch (IOException ioe) {
        // ignore
    }
}
25
ответ дан bluish 24 November 2019 в 05:05
поделиться

Одно решение, если этими двумя Исключениями являются два различных класса

try {
    ...
    }
catch(package1.Exception err)
   {
    ...
   }
catch(package2.Exception err)
   {
   ...
   }
finally
  {
  }

, Но иногда Вы не можете избежать этой второй выгоды попытки. например, для закрытия потока

InputStream in=null;
try
 {
 in= new FileInputStream("File.txt");
 (..)// do something that might throw an exception during the analysis of the file, e.g. a SQL error
 }
catch(SQLException err)
 {
 //handle exception
 }
finally
 {
 //at the end, we close the file
 if(in!=null) try { in.close();} catch(IOException err) { /* ignore */ }
 }
2
ответ дан Pierre 24 November 2019 в 05:05
поделиться
Другие вопросы по тегам:

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