에서 무효 또는 예기치 않은 파라미터에 대해 발생하는 예외는 무엇입니까?인터넷?
에서 무효 파라미터 또는 예기치 않은 파라미터에 대해 어떤 유형의 예외를 발생시킬 것인가.NET? 내가 언제 하나를 선택할까?
후속 조치:
월에 해당하는 정수를 요구하는 함수가 있고 '42'에 합격했다면 어떤 예외를 사용하시겠습니까?컬렉션이 아닌데도 '범위 밖'에 들어가는 건가요?
하고 싶다:ArgumentException,ArgumentNullException , , , , 입니다.ArgumentOutOfRangeException.
ArgumentException– 논쟁에 뭔가 문제가 있습니다.ArgumentNullException– 인수가 null입니다.ArgumentOutOfRangeException- 별로 사용하지 않지만, 컬렉션에 인덱스를 붙여서 큰 인덱스를 붙이는 것이 일반적입니다.
논의 자체에 초점을 맞추는 것이 아니라 콜 전체를 판단하는 다른 옵션도 있습니다.
InvalidOperationException– 인수는 정상이지만 객체의 현재 상태에서는 그렇지 않을 수 있습니다.Credit goes to STW (previously Yoooder). Vote his answer up as well.NotSupportedException– 전달된 인수는 유효하지만 이 구현에서는 지원되지 않습니다.FTP 클라이언트를 가정하면 클라이언트가 지원하지 않는 명령어를 전달합니다.
비결은 방법을 있는 그대로 부를 수 없는 이유를 가장 잘 나타내는 예외를 던지는 것입니다.이상적으로는 예외는 무엇이 잘못되었는지, 왜 잘못되었는지, 그리고 어떻게 수정해야 하는지에 대해 자세히 설명해야 합니다.
오류 메시지가 도움말, 문서 또는 기타 리소스를 가리킬 때 좋습니다.예를 들어 Microsoft는 "Why do I receive a Operation aborted error message when I visit a web page in Internet Explorer?" (Internet Explorer에서 웹 페이지를 방문했을 때 "조작 중단됨" 오류 메시지를 받는 이유)와 같은 KB 문서를 사용하여 적절한 첫 단계를 수행했습니다.에러가 발생하면, 에러 메세지의 KB 문서를 참조할 수 있습니다.그들이 잘하지 못하는 것은 왜 실패했는지 구체적으로 말해주지 않는다는 것이다.
다시 한 번 STW(전 유더)의 댓글에 감사드립니다.
당신의 폴로업 응답에 대해 MSDN이 말하는 이 예외에 대해 살펴보세요.
ArgumentOutOfRangeException된 인수 중늘레퍼런스(「」1」)가 경우에 느려집니다).Nothing비주얼 베이직).
따라서 이 경우 값은 전달되지만 범위는 1 ~12이므로 유효한 값은 아닙니다.그러나 문서화하는 방법을 보면 API가 무엇을 던지는지 알 수 있습니다.는 '아예'라고 말할 수 ArgumentOutOfRangeException 는 이렇게 말할 수 .ArgumentException이치노
저는 Josh의 답변에 찬성표를 던졌지만, 목록에 하나 더 추가하고 싶습니다.
System.InvalidOperation인수가 유효한 경우 예외가 발생해야 하지만 개체가 인수를 사용하면 안 되는 상태입니다.
MSDN에서 가져온 업데이트:
무효 조작예외는 메서드 호출 실패가 잘못된 인수 이외의 이유로 인해 발생한 경우에 사용됩니다.
객체에 PerformAction(enmSomeAction 액션) 메서드가 있다고 합시다.유효한 enmSomeActions는 Open과 Close입니다.PerformAction(enmSomeAction)을 호출한 경우.[Open] (오픈)을 2회 연속하면 두 번째 콜이 Invalid Operation을 슬로우합니다.예외(argment는 유효하지만 컨트롤의 현재 상태에 대해서는 유효하지 않기 때문에)
당신은 이미 방어적으로 프로그래밍을 하고 있기 때문에 Object Disposed는 예외입니다.예외.객체가 IDisposable을 구현한 경우 항상 클래스 변수를 사용하여 폐기된 상태를 추적해야 합니다. 객체가 폐기되고 메서드가 호출되면 ObjectDisposed를 올려야 합니다.예외:
public void SomeMethod()
{
If (m_Disposed) {
throw new ObjectDisposedException("Object has been disposed")
}
// ... Normal execution code
}
업데이트: 후속 조치에 응답하려면:이것은 다소 애매한 상황이며, 범용에 의해 조금 더 복잡해집니다(는 참조하지 않습니다.특정 데이터 집합을 나타내기 위해 사용되는 NET Generics 감지) 데이터 유형. 열거형 또는 기타 강력한 유형의 개체가 더 적합합니다. 그러나 이러한 제어가 항상 있는 것은 아닙니다.
개인적으로 ArgumentOutOfRangeException에 기대어 유효한 값이 1 ~12임을 나타내는 메시지를 제공합니다.내 추론은 월에 대해 말할 때 월의 모든 정수 표현이 유효하다고 가정할 때 1에서 12 사이의 값을 기대한다는 것입니다.특정 달(예를 들어 31일이 있는 달)만 유효하다면 범위 단위(Range per-se)를 다루지 않고 일반적인 인수를 사용합니다.유효한 값을 나타내는 예외이며, 메서드의 코멘트에도 기재합니다.
실제 값과 가장 적합한 예외에 따라 다음 작업을 수행합니다.
ArgumentException(값에 문제가 있음)ArgumentNullException(인수가 허용되지 않는 한 인수는 null입니다.ArgumentOutOfRangeException(인수의 값이 유효한 범위를 벗어남)
이 충분히하지 않은 , '를 '예외 클래스'에서 만 하면 .ArgumentException.
유더의 대답이 나를 깨우쳤다.입력이 항상 유효하지 않으면 무효이며, 시스템의 현재 상태에 유효하지 않으면 예기치 않은 입력입니다.따라서 후자의 경우 an이 합리적인 선택입니다.
- System. 인수예외.
- System.Argument Null Exception
- System.Argument Out Of Range Exception
논쟁메서드가 호출되고 전달된 인수 중 적어도1개가 호출된 메서드의 파라미터 사양을 충족하지 못할 때 예외가 느려집니다.인수의 모든 인스턴스예외에는 비활성 인수를 설명하는 의미 있는 오류 메시지와 인수의 예상 값 범위가 포함되어야 합니다.
특정 유형의 무효에 대한 하위 클래스도 몇 개 있습니다.링크에는 서브타입의 요약과 적용시기가 있습니다.
표준 인수가 있습니다.사용할 수 있는 예외 또는 하위 분류하여 직접 만들 수 있는 예외입니다.몇 가지 특정 인수가 있습니다.예외 클래스:
http://msdn.microsoft.com/en-us/library/system.argumentexception(VS.71).aspx
어느 것이든 가장 잘 되는 것.
다음 중 하나:
다 아니다
답변 더긴긴 longer longer:
Argument* library 라이브러리 등 있는 입니다.예외(컴포넌트 라이브러리와 같이 제품이 켜져 있는 라이브러리는 제외)는 냄새입니다.예외는 버그가 아닌 예외적인 상황을 처리하는 것이며 사용자(예: API 소비자)의 부족에 대처하는 것은 아닙니다.
[ ] [ 장 、 [ 。
잘못된 주장에 대해 예외를 두는 것은 도서관을 쓰지 않는 한 무례한 행동입니다.
두 가지그 이상)로 단언 한다.
- 어설션은 테스트할 필요가 없지만, 스로우 어설션은 테스트할 필요가 있습니다.Argument Null Exception에 대한 테스트는 터무니없어 보입니다(시도해 보십시오).
- 어설션은 유닛의 용도를 보다 잘 전달하고 클래스 동작 사양보다 실행 가능한 문서화에 가깝습니다.
- 어설션 위반 동작을 변경할 수 있습니다.예를 들어 디버깅 컴파일에서는 메시지박스가 문제없기 때문에 QA가 즉시 응답합니다(또한 IDE가 발생한 라인에서 끊어짐).유닛 테스트에서는 어설션 실패를 테스트 실패로 나타낼 수 있습니다.
null 예외의 처리는 다음과 같습니다(명백히 빈정거림).
try {
library.Method(null);
}
catch (ArgumentNullException e) {
// retry with real argument this time
library.Method(realArgument);
}
상황이 예상되지만 예외적인 경우(IO 장애와 같이 소비자가 통제할 수 없는 상황이 발생할 경우) 예외를 사용해야 한다.인수*예외는 버그를 나타내는 것으로, (내 의견은) 테스트와 디버깅으로 처리됩니다.주장하다
BTW: 이 경우 int 대신 Month 유형을 사용할 수 있습니다.C#는 타입의 안전성(Aspect#rulez!)에 대해서는 부족하지만, 이러한 버그를 모두 방지할 수 있는(또는 컴파일시에 잡을 수 있는) 경우가 있습니다.
그리고 네, 마이크로소프트는 그것에 대해 틀렸습니다.
언급URL : https://stackoverflow.com/questions/774104/what-exceptions-should-be-thrown-for-invalid-or-unexpected-parameters-in-net
'source' 카테고리의 다른 글
| SQL Server 출력 절을 스칼라 변수로 변환 (0) | 2023.04.07 |
|---|---|
| SQL에서 월의 첫 번째 날을 선택하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
| 활성 SQL Server 연결을 확인하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
| SQL 서버에서 중복 행 찾기 (0) | 2023.04.07 |
| 쉼표로 구분된 값을 열로 분할하는 방법 (0) | 2023.04.07 |