C # 메서드 이름에 "Try"는 언제 사용됩니까?


180

메소드 이름이 "Try"로 시작하는 경우의 의미에 대해 동료들과 논의했습니다.

다음과 같은 의견이있었습니다.

  • 메소드가 널값을 리턴 할 수있는 경우 "시도"를 사용하십시오.
  • 메소드가 예외를 발생시키지 않으면 "시도"를 사용하십시오.

공식적인 정의는 무엇입니까? 메소드 이름에 "시도"란 무엇입니까? 이것에 대한 공식적인 지침이 있습니까?


83
+1이 기능을 많은 사람들의 이름으로 생각한 사람들은 실제로 "다음 사람"을 찾고 있습니다. 확실하지 왜 가까운 표를 얻고있다 (그의 캐스팅있어 사람에서 오는 많은 이들 오늘 밤을.)
조나단 라인 하트

7
@JonathonReinhart, "현재이 질문은 Q & A 형식에 적합하지 않습니다. 사실, 참조 또는 특정 전문 지식에 의해 답변이 뒷받침 될 것으로 예상되지만이 질문은 토론, 논쟁을 요구할 것입니다. , 설문 조사 또는 확장 된 토론입니다. "
Pranav Hosangadi

16
이다 (내 대답을 참조) 질문에 대한 대답 마이크로 소프트의 공식 성명. 그것은 사실이 아닌가?
Erik Schierboom

6
@PranavHosangadi는 Erik이 언급했듯이 사실에 의해 뒷받침됩니다. 또한 여기 에는 유효한 답변을 제공 할 수있는 전문 지식갖춘 숙련 된 C # 개발자가 많이 있습니다. 에릭 리퍼 트 ​​(Eric Lippert)는 C # 언어 설계자이다. 나는 당신이 그 특정 전문 지식을 부를 수 있다고 생각합니다 .
Jonathon Reinhart

4
@ErikSchierboom 그것이 MS 가이드 라인이라는 것이 사실입니다. MS 가이드 라인이 올바른 가이드 라인이라는 것은 주관적이고 논쟁의 여지가 있습니다.
Servy

답변:


148

이를 TryParse 패턴 이라고하며 Microsoft에서 문서화했습니다. 공식 예외 및 성능 MSDN 페이지는 말한다 :

예외와 관련된 성능 문제를 피하기 위해 일반적인 시나리오에서 예외를 발생시킬 수있는 멤버의 TryParse 패턴을 고려하십시오.

따라서 일반적인 유스 케이스에 예외가 발생할 수 있음을 의미하는 코드가있는 경우 (예 : 정수 구문 분석) TryParse 패턴이 의미가 있습니다.


2
문서가이 패턴 (TryParse 검색) 또 다른 유용한 링크 blogs.msdn.com/b/kcwalina/archive/2005/03/16/396787.aspx
비벡 Maharajh

2
기본적으로 TryParse 메서드가 있으면 TryParse가 false를 반환 할 때 발생하는 Parse 메서드가 있어야합니다. 반대로, Parse 메소드가있는 경우 Parse가
발생할

5
+1. 이에 덧붙여, 예외는 일반적으로 "예외"상황에 대한 것입니다. 당신이 뭔가를하고 있다면 쉽게 실패하고 그 실패가 특히 주목할만한되지 수있는,이 패턴을 사용하여 시도 / 캐치보다 더 관용적이다
아담 로빈슨

그러한 패턴에는 실제로 Microsoft의 지침이 필요 했습니까? 상당히 기본적인 것 같습니다.
Dave Lawrence

19
그것은 이다 기본적인 것들,하지만 그 지침이 유용하지 않은 것은 아닙니다. 플랫폼에 대해 잘 모르면 기본 사항을 얻는 것이 매우 어려울 수 있습니다.
Erik Schierboom 2014 년

119

(수정 됨) Erik이 제안한 공식 지침이 있습니다.

TrySomething방법을 볼 때에

  • 던지지 않는다
  • 보고 bool
  • 값을 기대하면 'out'매개 변수를 통해 반환됩니다.
  • Something내가 예외를 직접 처리 할 수있는 방법 이 있습니다 . (Jesse Webb가 제안한 편집)

4
수정-공식 지침이 있습니다. Erik의 답변을 참조하십시오.
nothrow

8
+1 그러나 네 번째 기대도 있습니다. TryFoo메서드가있는 경우 비슷한 Foo예외가 발생하여``예외를 직접 처리 할 수 ​​있습니다. 이러한 메소드의 시그니처는 다를 수 있으므로 다른 코드 변경 없이는 사용법을 바꿀 수 없습니다.
Jesse Webb

1
@JesseWebb, 지적 해 주셔서 감사합니다. 마음에 들지 않으면 귀하의 의견을 답변에 추가했습니다.
nothrow

1
"던지지 마라"는 과장된 것 같습니다. 예를 들어 Int32.TryParse (String, NumberStyles, IFormatProvider, Int32)는 style 매개 변수가 마음에 들지 않으면 ArgumentException을 발생시킵니다.
Jirka Hanika

나는 "투척하지 않았다"는 지나치게 일반화 된 것으로 간주 될 수 있지만, 그 의도는 매개 변수의 가치보다는 실행의 결과로 던져지지 않는다는 것을 전달하는 것이라고 생각한다.
ConfusingBoat

8

try계속 진행하고 싶을 때 사용해야한다고 생각 합니다. 메소드가 값을 리턴하는지 여부는 중요하지 않습니다.

사례 1 : 문제가 없으면 어떻게 든 진행할 수 있습니다.

사례 2 : 반환되지 않으면 여전히 괜찮습니다. 다른 방법으로 진행할 수 있습니다.

그리고 해당 메소드의 출력으로 일부 값을 예상하면 out매개 변수 를 사용하십시오 .

int value
if (dictionary.TryGetValue("key", out value))
{
    // Proceed in some way
}
else
{
    // Proceed in some other way
}

6

메소드 호출이 유효하지 않은 결과를 생성 할 수 있다는 사실을 나타내려면 메소드 이름에 "Try"를 사용해야합니다. .NET 표준에 따르면 예외를 발생시키는 함수가 아니라 일부 VALID또는NON_VALID 프로그램의 관점에서, 값입니다.

결국, 이것은 그룹에서 사용하기로 결정한 명명 규칙에 관한 것입니다.


5

다음 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를 더 의미있게 읽으 려면 읽어야 합니다.
Pierre Arnaud

@PierreArnaud 감사합니다, 그것을 변경했습니다!
Fabian Bigler

int number;try 블록 및 number = ...할당 전에 선언 이 여전히 누락되었습니다 .
Pierre Arnaud

@PierreArnaud 감사합니다. 또한 'int number'도 포함 시켰습니다.
Fabian Bigler

예외가 TryLoadFile(path, out file)RAM에서 woah 와 같이 수행되는 직접 조치와 관련이없는 경우 여전히 예외를 처리 할 수 ​​있습니다 . 따라서 호출자는 잘못된 경로 나 액세스 거부에 대한 오류는 예상하지 않고 잘못 될 수도있는 예외적 인 경우에는 예외입니다. 그리고 그것을 문서화하십시오.
Luke Puplett

0

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.

그만큼 TryParseMicrosoft 패턴은 출력 매개 변수를 피해야한다는 명확한 코드 지침을 위반합니다.

새 버전의 C #을 개발하지 않는 경우 모든 Microsoft 지침을 준수 할 필요는 없습니다. 때때로 그들은 최고가 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.