2017-02-14 2 views
-1

Итак, я использовал несколько блоков try/catch во время моего первого обучения C#. По большей части они отлично работали. Однако есть пара, где код все еще ломается в точке исключения, несмотря на то, что он находит точный тип исключения, о котором я ожидал и надеялся. Я приведу пример кода, в котором эта проблема возникает.Исключения, не ловящиеся с использованием блока catch. Зачем?

Вот где я пытаюсь поймать исключение:

app.MoveFolder(input1, input2); 

       try 
       { 
        //code here 
       } 
       catch(ArgumentException) 
       { 
        //code here 
       } 
       break; 

Вот функция, где я создаю исключение:

public void MoveFolder(string folderPath, string newLocation) 
    { 
     this.ThrowExceptionIfFolderDoesntExist(folderPath); 

     if (Directory.Exists(newLocation) == true) 
     { 
      throw new ArgumentException("pls wrk"); 
     } 
     Directory.Move(folderPath, newLocation); 
    } 

В 'ThrowExceptionIfFolderDoesntExist()' функция приводит к следующему:

private void ThrowExceptionIfFolderDoesntExist(string folderPath) 
    { 
     if(this.CheckFolderExists(folderPath) == false) 
     { 
      throw new ArgumentException("This folder does not exist"); 
     } 
    } 

Итак, как вы можете видеть, и это, и оператор if в моей функции MoveFolder() должен возвращать аргументы, которые я надеялся поймать. В случае последней функции это работает по назначению. Однако, если я пытаюсь переместить папку в папку, которая уже существует, то я получаю следующее:

Unhandled Exception: System.ArgumentException: pls wrk 

Это не то, что я хотел, как я хочу, чтобы блок задвижки справиться с этой конкретной ArgumentException также , Является ли это чем-то связанным с блоком catch catch, я имею в виду конкретное исключение аргумента? Я бы подумал, что это будет относиться ко всем аргументам ArgumentExceptions.

Как я могу это решить?

Спасибо.

+2

Ну, вызов MoveFolder не находится внутри блока try, почему вы ожидаете получить исключение? – Steve

+1

вещь, которая бросает исключение (MoveFolder), существует вне блока catch try. перемещение app.MoveFolder (input1, input2) внутри блока try –

+1

'app.MoveFolder (input1, input2); 'должен находиться внутри' try' ... Где ваш первый комментарий «// code here' is – pinkfloydx33

ответ

3

Для того, чтобы сделать правильный TRY/поймать, что вам нужно сделать следующее:

  1. метод поместить в try блоке
  2. catchException(s)
  3. throwException

Вот несколько кодов

try 
{ 
    app.MoveFolder(input1, input2); 
} 
// catch ArgumentException 
catch(ArgumentException ex) 
{ 
    throw; 
} 
// catch all others 
catch(Exception ex) 
{ 
    throw; 
} 
+0

таким образом Stacktrace и возможные внутренние исключения теряются.Если вы намереваетесь просто выбросить исключение на следующий уровень, просто используйте 'throw', не создавая нового исключения –

+0

@MongZhu - Вы правы, я исправил его. – Svek

+0

Ага! по какой-то причине я решил поместить функции за пределы блока catch, потому что я думал, что он должен был запустить функцию сначала, чтобы исключение появилось до того, как оно достигло либо try, либо catch. Это хорошо отвечает на мой вопрос, большое спасибо! – jamessct

0

Чтобы поймать исключение, вызванное функцией, функцию необходимо вызвать в Try {}. Вы можете сделать так, как сказали другие, и вызвать MoveFolder внутри блока Try. Если вы выкидываете исключение за пределы блока Try, его иногда могут захватывать другие блоки catch или просто необработанные и создает ошибку.

try 
{ 
    app.MoveFolder(Something1, Something2); 

} catch {ArgumentException) { 

//Do something with Exception 
} 
+0

Я выбрал другой ответ, когда он добрался туда первым, но ура это ответ на мой вопрос :) – jamessct

Смежные вопросы