C #에서 특정 조건이 충족 될 때 catch 핸들러를 실행할 수있는이 새로운 기능을 발견했습니다.
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
나는 이것이 언제 유용 할 수 있는지 이해하려고 노력하고 있습니다.
하나의 시나리오는 다음과 같을 수 있습니다.
try
{
DatabaseUpdate()
}
catch (SQLException e)
when (driver == "MySQL")
{
//MySQL specific error handling and wrapping up the exception
}
catch (SQLException e)
when (driver == "Oracle")
{
//Oracle specific error handling and wrapping up of exception
}
..
그러나 이것은 다시 동일한 핸들러 내에서 수행 할 수 있고 드라이버 유형에 따라 다른 메소드에 위임 할 수 있습니다. 코드를 더 쉽게 이해할 수 있습니까? 틀림없이 아니오.
제가 생각할 수있는 또 다른 시나리오는 다음과 같습니다.
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
다시 이것은 내가 할 수있는 일입니다.
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
'catch, when'기능을 사용하면 핸들러를 건너 뛰고 핸들러 내에서 특정 사용 사례를 처리 할 때보 다 훨씬 빨리 스택 해제가 발생할 수 있으므로 예외 처리가 더 빨라 집니까? 사람들이 모범 사례로 채택 할 수있는이 기능에 더 적합한 특정 사용 사례가 있습니까?
try..catch...catch..catch..finally
합니까?
catch (Exception ex)
, 유형 검사 등 만 할 수 있습니다 throw
. 약간 더 체계적인 코드 (코드 노이즈 방지)가 정확히이 기능이 존재하는 이유입니다. (이것은 실제로 기능을 많이 마찬가지입니다.)
when
요구는 예외 자체에 액세스 할 수