У меня есть служба 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();
когда при запуске приложения методом DoSomething () было сгенерировано исключение FaultException, сначала исключение было перехвачено в строке «catch (Exception ex)» и там прерывается. затем, когда я снова нажал f5, он делает то, что обычно должен. Интересно, почему существует этот разрыв? а если нет, может быть проблема с публикацией?





@yapiskan,
C# - это язык со строгой типизацией Foo <X>! = Foo. Поэтому, если вам нужно поймать какое-то исключение, укажите тип точный в предложении ловить.
Вы можете узнать больше об обработке исключений, прочитав статью это MSDN.
На самом деле ваше исключение перехвачено, но вы не замечаете его, поскольку Visual Studio выделяет следующую строку, а не строку, генерирующую исключение. Заменять
throw;
с некоторыми другими линиями и увидеть их в действии.
Это не работает. Поскольку строка throw не находится в блоке try, она должна быть перехвачена родительским блоком catch.
Проблема в том, что исключения проверяются в порядке их объявления. Попробуйте сначала поставить блок 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;
}
HTH.
Я знал, что блоки catch не рекурсивны, но использование блоков catch, как вы упомянули, сделает код похожим на лестницу, и мне это не нравится. И я не понимаю, почему исключение не улавливается. Он пойман, но там есть перерыв, который заставляет меня нажать кнопку f5, чтобы продолжить.
Вы используете службу WCF от Silverlight? В этом случае требуется специальная конфигурация, чтобы служба возвращала код HTTP 200 вместо 500 в случае ошибки. Подробности здесь: http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx
это более актуально для SL4: msdn.microsoft.com/en-us/library/ee844556(VS.95).aspx
возможно, ты следует присмотреться;) [SerializableAttribute] открытый класс FaultException <TDetail>: FaultException var fooFault = new FaultException <Foo> (); fooFault is FaultException; // истинно, поэтому блок catch с catch (FaultException ex) перехватит FaultException <Foo> * только что видел ваши комментарии выше ... этот комментарий все еще вводит в заблуждение