Бросить исключение из вызываемой функции в блок захвата функции вызывающей стороны - PullRequest
10 голосов
/ 11 августа 2011
internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    catch(FileNotFoundException ex)
    {
        throw ex;
    }
    catch(Exception ex)
    {
        throw ex;
    }
    finally
    {
        ...
    }
}


//Reading File Contents

public void ReadFile()
{
    try
    {
        ...
        ReadCSVFile(filePath);
        ...
    }
    catch(FileNotFoundException ex)
    {
        ...
    }
    catch(Exception ex)
    {
        ...
    }
}

Здесь, в приведенном выше примере кода, у меня есть две функции ReadFile и ReadCSVFile.
В файле ReadCSVFile я получаю исключение типа FileNotFoundExceptioon, которое попадает в блок catch (FileNotFoundException). Но когда я выбрасываю это исключение, чтобы оно было поймано в catch (FileNotFoundException) функции ReadFile (), оно попадает в блок catch (Exception), а не catch (FileNotFoundException). Более того, во время отладки значение ex говорит как Object Not Initialized. Как я могу выбросить исключение из вызываемой функции в блок catch вызывающей функции без потери внутреннего исключения или по крайней мере сообщения об исключении?

Ответы [ 5 ]

13 голосов
/ 11 августа 2011

Вы должны использовать throw; вместо throw ex;:

internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    catch(FileNotFoundException ex)
    {
        throw;
    }
    catch(Exception ex)
    {
        throw;
    }
    finally
    {
        ...
    }
}

Кроме того, если вы ничего не делаете в своем блоке перехвата, кроме повторного броска, вам совсем не нужен блок перехватчика:

internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    finally
    {
        ...
    }
}

Реализуйте блок catch только:

  1. , когда вы хотите обработать исключение.
  2. , когда вы хотите добавить дополнительную информацию к исключению, создав новое исключение с перехваченным внутренним исключением:

    catch(Exception exc) { throw new MessageException("Message", exc); }

Вам не нужно реализовывать блок catch в каждом методе, через который может пройти исключение.

1 голос
/ 11 августа 2011

Вы должны заменить

throw ex;

от

throw;
1 голос
/ 11 августа 2011

Просто используйте throw в вызываемой функции. Не перегружайте блоки catch несколькими типами исключений. Пусть звонящий позаботится об этом.

0 голосов
/ 11 августа 2011

Ваш код отлично работает здесь, проверьте здесь http://ideone.com/jOlYQ

0 голосов
/ 11 августа 2011

В вызываемой функции просто используйте throw вот так

 try
 {
   //you code
 }
 catch
 {
     throw;
}

Теперь, если здесь возникнет исключение, то это будет перехвачено функцией вызывающего.

...