메소드 이름이 "Try"로 시작하는 경우의 의미에 대해 동료들과 논의했습니다.
다음과 같은 의견이있었습니다.
- 메소드가 널값을 리턴 할 수있는 경우 "시도"를 사용하십시오.
- 메소드가 예외를 발생시키지 않으면 "시도"를 사용하십시오.
공식적인 정의는 무엇입니까? 메소드 이름에 "시도"란 무엇입니까? 이것에 대한 공식적인 지침이 있습니까?
메소드 이름이 "Try"로 시작하는 경우의 의미에 대해 동료들과 논의했습니다.
다음과 같은 의견이있었습니다.
공식적인 정의는 무엇입니까? 메소드 이름에 "시도"란 무엇입니까? 이것에 대한 공식적인 지침이 있습니까?
답변:
이를 TryParse 패턴 이라고하며 Microsoft에서 문서화했습니다. 공식 예외 및 성능 MSDN 페이지는 말한다 :
예외와 관련된 성능 문제를 피하기 위해 일반적인 시나리오에서 예외를 발생시킬 수있는 멤버의 TryParse 패턴을 고려하십시오.
따라서 일반적인 유스 케이스에 예외가 발생할 수 있음을 의미하는 코드가있는 경우 (예 : 정수 구문 분석) TryParse 패턴이 의미가 있습니다.
(수정 됨) Erik이 제안한 공식 지침이 있습니다.
TrySomething
방법을 볼 때에
bool
Something
내가 예외를 직접 처리 할 수있는 방법 이 있습니다 . (Jesse Webb가 제안한 편집)TryFoo
메서드가있는 경우 비슷한 Foo
예외가 발생하여``예외를 직접 처리 할 수 있습니다. 이러한 메소드의 시그니처는 다를 수 있으므로 다른 코드 변경 없이는 사용법을 바꿀 수 없습니다.
try
계속 진행하고 싶을 때 사용해야한다고 생각 합니다. 메소드가 값을 리턴하는지 여부는 중요하지 않습니다.
사례 1 : 문제가 없으면 어떻게 든 진행할 수 있습니다.
사례 2 : 반환되지 않으면 여전히 괜찮습니다. 다른 방법으로 진행할 수 있습니다.
그리고 해당 메소드의 출력으로 일부 값을 예상하면 out
매개 변수 를 사용하십시오 .
int value
if (dictionary.TryGetValue("key", out value))
{
// Proceed in some way
}
else
{
// Proceed in some other way
}
다음 try
과 같은 경우 메소드 이름 에 포함하십시오 .
bool TrySomething(input, out yourReturn)
따라서 기본적으로 try
-methods 를 사용 하면 부울 결과 만 반환됩니다.
따라서 다음 코드는 예외를 발생시키지 않습니다.
string input = "blabla";
int number;
if (int.TryParse(input, out number))
{
// wooohooo we got an int!
} else
{
//dooh!
}
이 코드는 예외를 던질 수 있지만 (이 경우) 예외를 던질 수 있습니다.
string input = "blabla";
int number;
try
{
number = int.Parse(input); //throws an exception
}
catch (Exception)
{
//dooh!
}
Try 메서드를 사용하는 것이 더 안전하고 방어적인 코드 작성 방법입니다. 또한 코드 스 니펫 # 2는 정수가 아닌 경우 실행하는 데 더 많은 성능이 필요합니다.
int number = int.Parse(input);
이 맥락에서 코드 스 니펫 # 2를 더 의미있게 읽으 려면 읽어야 합니다.
int number;
try 블록 및 number = ...
할당 전에 선언 이 여전히 누락되었습니다 .
TryLoadFile(path, out file)
RAM에서 woah 와 같이 수행되는 직접 조치와 관련이없는 경우 여전히 예외를 처리 할 수 있습니다 . 따라서 호출자는 잘못된 경로 나 액세스 거부에 대한 오류는 예상하지 않고 잘못 될 수도있는 예외적 인 경우에는 예외입니다. 그리고 그것을 문서화하십시오.
Bob 아저씨는 아래 그의 책 Clean Code 에서 예를 보여줍니다 . 예외가 발생할 것으로 예상 될 때마다 Try
메소드 이름에 접두사를 사용할 수 있습니다 .
public void sendShutDown()
{
try{
tryToShutDown();
} catch (DeviceShutDownError e) {
logger.log(e);
}
}
그리고 나서 (적응) :
private void tryToShutDown()
{
//some code with no error handling, but
//something might go wrong here
}
tryToShutDown
메소드는 오류 처리를하지 않습니다 . 메소드의 책임이기 때문입니다 sendShutDown
.
그만큼 TryParse
Microsoft 패턴은 출력 매개 변수를 피해야한다는 명확한 코드 지침을 위반합니다.
새 버전의 C #을 개발하지 않는 경우 모든 Microsoft 지침을 준수 할 필요는 없습니다. 때때로 그들은 최고가 아닙니다.