코드의 경우를 예를 들어 클릭 할 때의 이벤트 핸들러와 같이 프런트 엔드에있는 파일에 액세스하려는 경우 오류 상황을 확인하고 메시지를 표시 한 다음 돌아 오는 것이 좋습니다.
내가 제대로 질문을 이해한다면 당신은이 작업을 수행해야하는지 여부를 알고 싶어, 잘 될 것
public void button_Click() {
if(!File.Exists(textBox.Text)) {
MessageBox.Show("Could not find the file");
return;
}
ProcessFile(textBox.Text); // would have thrown an exception if the file didn't exist
}
에는 processFile 그것을 처리되지 않습니다 예외의 다른 종류를 throw하는 경우를 제외하고.
이 작업을 수행 할 수 있습니다 :
public void button_Click() {
try {
ProcessFile(textBox.Text); // throwns an exception if the file didn't exist
} catch(Exception ex) {
MessageBox.Show(GetUserMessage(ex));
return;
}
}
을 내 생각에이 두 가지를 모두 수행하는 것이 좋습니다 :
public void button_Click() {
try {
if(!File.Exists(textBox.Text)) {
MessageBox.Show("Could not find the file");
return;
}
ProcessFile(textBox.Text); // throwns an exception if the file didn't exist
} catch(Exception ex) {
MessageBox.Show(GetUserMessage(ex));
return;
}
}
당신이 관련 사용자에게 가장 구체적인 메시지를 제공 할 수있는이 방법을 그가 무엇을하고 있었는지 이 지점에서. 예를 들어 Excel 파일을 열려고하면 "가져 오려는 Excel 파일을 찾을 수 없습니다"라고 말할 수 있습니다.
파일을 삭제하려고 시도한 시점과 파일을 처리하려고 시도한 시점 사이에 파일 이름이 바뀐 경우에도 작동합니다.
public void button_Click() {
try {
if(!File.Exists(textBox.Text)) {
throw new UserException("Could not find the file");
}
ProcessFile(textBox.Text); // throwns an exception if the file didn't exist
} catch(Exception ex) {
MessageBox.Show(GetUserMessage(ex));
return;
}
}
이 경우 자신의 예외 클래스 UserException
를 작성하고 그냥 번역하지 않고 함께 그 메시지를 전달합니다 :
또는이와 비슷한 작업을 수행 할 수있다. 이렇게하면 메시지를 표시하는 데 사용하는 동일한 코드를 다시 사용할 수 있습니다. 클래스
오류가 다음 예외를 throw 할 몇 가지 클래스 라이브러리에서 발생하는 경우에서
예외. 예외의 목적은 오류가 눈에 띄지 않게 할 수 없다는 것입니다.
예를 들어, 당신은이 원하지해야
class MyFileHandler {
public void OpenFile(string fileName) {
if(!File.Exists(fileName)) return;
// do stuff
}
public void DoStuff() {
// do stuff
}
}
개발자 그가이 일을 가정 할 myFileHandlerInstance.OpenFile("note.txt")
라고 이제합니다.당신과 같이, 부울을 반환 할 수 : class MyFileHandler {
public bool OpenFile(string fileName) {
if(!File.Exists(fileName)) return false;
// do stuff
return true;
}
public void DoStuff() {
// do stuff
}
}
을하지만 지금은 그 값을 확인 개발자에 의존하고, 이것은 일반적인 방법으로 사용되지만 오류는 무시되었다 및 예외가 더 좋은 연습이되었습니다 이유입니다 간과.
사용자에게 무엇을 표시해야하는지는 예외 메시지를 직접 표시해서는 안되며, 개발자가 아닌 사용자를 대상으로합니다. 만약 당신이 좋아하면
public string GetUserErrorMessage(Exception ex) {
if(ex is FileLoadException) {
var fileLoadException = (FileLoadException)ex;
return "Sorry but we failed to load the file: " + fileLoadException.FileName;
}
}
당신은 오류 코드를 포함한 자세한 내용은 예외 속성을 검사 할 수 있습니다 : 그래서 같은 예외 객체를 사용하여 최적의 메시지를 반환하는 방법을 제안한다. 또한 어딘가에 사용자가 볼 수없는 어딘가에 자신의 디버깅 목적을 위해 어딘가에 실제 예외 정보를 캡처하는 것이 좋습니다.
이것은 모두 실제로 * 나쁜 생각입니다. 이미이 코드가 없으면 괜찮은 예외 메시지가 나타납니다. StreamReader 생성자가 Message 속성을 throw하고 표시하는 예외를 잡습니다. –
그래, 이해 하겠지만 사용자가 쉽게 이해할 수있는 맞춤 메시지를 보여주고 싶다. 잡는 것보다 예외를 피하는 것이 더 좋지 않은가? – CudoX
메시지 프리젠 테이션을 io 액세스와 분리해야합니다. 아마 당신의 코드가 언젠가 콘솔 앱에서 사용될 것입니까? Btw는 예기치 않은 실행 경로에만 예외를 사용하고 존재하지 않는 파일은 예외로 사용하지 않습니다. –