2012-04-13 3 views
0

У меня есть цикл, который выполняется несколько раз и склонен к исключениям (он основан на сети). Тем не менее, я не хочу бросать что-либо прямо из метода, поскольку я хочу, чтобы он переместился на следующую итерацию в случае ошибки. Итак, что я сделал, я добавил ссылочный параметр, который передает вызывающий, и все исключения помещены туда.Как добраться до внутреннего объекта

Я хочу вернуться к пользователю Exception, а также URL повреждения, поэтому я создал следующий объект:

class KeywordException 
{ 
    Exception ex; 
    string faultURL; 
} 

Он возвращается пользователю как ref List<KeywordException> exceptions

Хорошо это все хорошо до сих пор, и я перехватывать исключения так:

catch (ArgumentNullException ane) 
{ 
    exceptions.Add(new KeywordException(ane, URL)); 
    continue; 
} 

Он работает и исключение возвращается к пользователю, но как я могу от вызывающего кода знает, что на самом деле исключение был? Все, что я получаю, это Exception, когда на самом деле это ArgumentNullException.

+2

Почему ваше исключение KeyWordException наследует от Exception? – MPelletier

ответ

1

Проблемы заключается в том, что ваш класс KeywordException хранит исключение в качестве исключения (что делает смысл и, вероятно, правильный).

Почему вы хотите узнать точное исключение? Отображать ли сообщение пользователю? В этом случае вы можете использовать отражение, чтобы получить конкретный тип переменной ex:

string exceptionType = keywordException.ex.GetType().Name; 
+0

Могу ли я использовать это, чтобы получить полное исключение? Что-то вроде 'var exception = keywordException.ex.GetType();'? – TheGateKeeper

+1

Нет, что дает объект Type. У вас уже есть полное исключение в ex vairable. Он просто отличен как исключение и требует возврата к фактическому типу. См. Мой комментарий в ответе выше. Вам нужно создать свой собственный класс, который вы вернете обратно пользователю. Этот класс должен описывать результат, а не передавать Исключения и ожидать, что пользователь узнает, что с ними делать. – Martyn

+0

Вы правы, я создам свое собственное исключение. Это намного проще и будет работать лучше для пользователя. – TheGateKeeper

1

Вы можете посмотреть имущество InnerException - оно существует для любых случаев.

Эта информация также относится к трассировке стека исключения.

Один из конструкторов Exception принимает Exception - если вы используете это, InnerException будет установлен в качестве исключения.

+0

поэтому Exception ex = new SomeOtherException заставляет внутреннее исключение ex быть SomeOtherException? – TheGateKeeper

+0

@TheGateKeeper - Только если вы передадите фактическое исключение в конструктор. – Oded

+1

@TheGateKeeper: Действительно ли ваш класс KeywordException на самом деле получается из «Исключения»? Если нет, я подозреваю, что «InnerException» - это красная селедка. Если да, уточните свой вопрос с более точным примером - и скажите, что вы пытаетесь сделать с исключениями. –

1

Несмотря на то, времени компиляции типа KeywordException.ex просто Exception, при входе его вы увидите реальный объект. Вы могли тест для конкретных типов с помощью:

if (keywordException.ex is ArgumentNullException) 

, но я сомневаюсь, что вы хотите сделать это. Вы должны быть в порядке, чтобы просто безошибочно регистрировать исключение - или показывать его пользователю в любой форме.

EDIT: Вы можете позвонить GetType() на исключение, чтобы получить его тип, конечно, тоже:

Type exceptionType = keywordException.ex.GetType(); 

... но это еще не ясно, почему вы хотите, чтобы лечить некоторые исключения по-разному к другим.

EDIT: Если вам нужно использовать информацию типоспецифического в исключении, вы должны использовать что-то вроде:

WebException webException = keywordException.ex as WebException; 
if (webException != null) 
{ 
    // Use webException here 
} 
+0

Думаю, мне придется использовать 'is' для этого, я не вижу другого способа узнать, что на самом деле было Исключение от вызывающего кода. – TheGateKeeper

+0

@ TheGateKeeper: Зачем вам нужно знать? Что вы пытаетесь сделать * за исключением? –

+0

Мне нужно знать, потому что некоторые исключения имеют конкретные детали, которые мне нужно использовать. Я бы с удовольствием использовал общий «Exception.Message» в большинстве случаев, но в случае «WebException» мне нужно знать значение «WebException.Status», чтобы показать реальную ошибку для пользователя. – TheGateKeeper

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