Не удается обработать FaultException
У меня есть служба wcf, которая делает операцию. и в этой операции может быть неисправность. Я заявил, что в моем контракте на обслуживание может быть ошибка.
вот код ниже;
public void Foo()
{
try
{
DoSomething(); // throws FaultException<FooFault>
}
catch (FaultException)
{
throw;
}
catch (Exception ex)
{
myProject.Exception.Throw<FooFault>(ex);
}
}
в договоре на обслуживание;
[FaultException(typeof(FooFault))]
void Foo();
когда FaultException вызывалось методом DoSomething() во время работы приложения, сначала исключение было перехвачено в строке "catch(Exception ex)" и разрывалось там. затем, когда я снова нажал клавишу f5, он делает то, что обычно должен. Интересно, почему этот разрыв существует? а если нет, может ли это быть проблемой при публикации?
5 ответов
Вы используете сервис WCF от Silverlight? Если это так, необходима специальная конфигурация, чтобы служба возвращала код HTTP 200 вместо 500 в случае ошибки. Подробности здесь: http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx
На самом деле ваше исключение обнаруживается, но вы не замечаете его, поскольку Visual Studio выделяет следующую строку, а не строку, которая выдает исключение. замещать
throw;
с некоторыми другими линиями и увидеть их в действии.
Присмотритесь к уловленному исключению. Было ли это FaultException
Проблема в том, что исключения проверяются в порядке их объявления. Попробуйте сначала поставить блок catch Exception, и вы увидите, что компилятор жалуется: другие блоки catch НИКОГДА не будут оцениваться. Следующий код, как правило, делает.Net в вашем случае:
// Begin try
DoSomething(); // throws FaultException<FooFault>
// End try
if (exceptionOccured)
{
if(exception is FaultException) // FE catch block.
{
throw;
// Goto Exit
}
if(exception is Exception) // EX catch block
{
throw new FaultException<FooFault>();
// Goto Exit
}
}
// Exit
Как вы можете видеть, ваше FaultException никогда не входит в try-catch-finally (то есть try-catch-finally не является рекурсивным по своей природе).
Попробуйте это вместо этого:
try
{
try
{
DoSomething(); // throws FaultException<FooFault>
}
catch (Exception ex)
{
if (ex is FaultException<FooFault>)
throw;
else
myProject.Exception.Throw<FooFault>(ex);
}
}
catch (FaultException)
{
throw;
}
НТН.
@yapiskan,
C# - строго типизированный язык Foo
Вы можете узнать больше об обработке исключений, прочитав эту статью MSDN.