2015-02-11 3 views
-2

У меня есть функция, которая должна бросить исключение, но я хотел, чтобы бросить это исключение в строке, где я назвал эту функцию:C исключение # заброс вызывающей

static int retrieveInt() 
{ 
    int a = getInt(); 
    if(a == -1) 
     throw new Exception("Number not found"); //The runtime error is pointing to this line 
    return a; 
} 

static void Main(string[] args) 
{ 
    int a = retrieveInt(); //The runtime error would be happening here 
} 
+1

ли вы имеете в виду 'Int А = retrieveInt(),' 'в вашем методе Main'? – Habib

+1

Почему вы хотите усложнить отладку кода? –

+0

Да, я имел в виду retrieveInt(). Я хочу, чтобы было легче отлаживать, поскольку в разных частях моего кода нужно обрабатывать по-разному по-разному. –

ответ

1

Описанное поведение не является строго возможно , но работа с желаемым эффектом.

Проблема, с которой вы сталкиваетесь, заключается в том, что в Visual Studio выполнение приостанавливается, и мы видим исключения из наиболее доступного местоположения с информацией об отладке. Для методов структуры это означает вызов метода, хотя исключение вызывает несколько вызовов глубже. Поскольку исключение исходит из того же проекта, который вы отлаживаете, у вас всегда будет отладочная информация для фактической строки throw, и, таким образом, вы всегда будете достигать этой линии.

Обходной путь здесь заключается в том, чтобы использовать окно Call Stack в VS, которое будет содержать пару строк по вызову метода, вызвавшему ошибку, и двойное нажатие на это приведет к тому, где вы хотите быть, включая все локальные переменные во время разговора. Это аналогично поведению структуры, потому что, если вы посмотрите на трассировку стека, несколько кадров помечены как «внешние», потому что у них нет информации об отладке.

EDIT: Чтобы добавить некоторую информацию о поведении try и catch, catch будет реагировать на любые исключения уже не поймали - таким образом, даже если исключение несколько вызовов глубже, если она не обрабатывается время стек вызовов разворачивается в ваш блок try, он попадет в соответствующий блок catch (если таковой имеется).

-1

Как насчет этого?

public static int NewInt 
{ 
    get 
    { 
      throw new Exception("Number not found"); 
    } 
} 

static void Main(string[] args) 
{ 
    int a = NewInt; 
} 
1

После двухчасового поиска я нашел ответ на свой вопрос. Для того, чтобы делать то, что я хотел, чтобы это необходимо, чтобы пользователь [System.Diagnostics.DebuggerStepThrough] до функции:

[System.Diagnostics.DebuggerStepThrough] 
static int retrieveInt() 
{ 
    int a = getInt(); 
    if(a == -1) 
     throw new Exception("Number not found"); //The runtime error will not be here 
    return a; 
} 

static void Main(string[] args) 
{ 
    int a = retrieveInt(); //The runtime error happens now here 
} 
+1

Это не влияет на то, где генерируется исключение. – Servy

+0

Это работало на меня. Либо вы не поняли мою проблему, либо не попробовали то, что я предложил. –

+0

Возможно, вы сделали то, что хотели, но это не значит, что вы задали в своем вопросе. – Servy