异常处理中多个"catch"块的目的是什么
What is the purpose of multiple "catch" blocks in exception handling
为什么我们需要多个“catch”块,即使我们可以编写一个泛型
异常?
了解所有异常类型及其目的对于编写好的代码很重要吗?
我在谷歌上搜索了很多,但仍然对异常处理感到困惑。有什么好的例子吗?
一般异常:
try{
//some code
}
catch(Exception e){
//print e
}
//that's it.
多次捕获
try{
//some code
}
catch(IOException e){
}
catch(SQLException e){
}
1.为什么我们需要多个 "catch" 块,即使我们可以编写一个通用异常?
有时您可能需要指定导致问题的原因。
例如,
try {
...
} catch(IOException e) {
// Print "Error: we cannot open your file"
} catch(SQLException e) {
// Print: "Error: we cannot connect to the database"
}
通过不同的错误,用户可以很容易地理解哪里出了问题。
如果我们选择
try {
...
} catch(Exception e) {
// Print "Error: " + e.
}
用户更难找出问题所在。
此外,如果我们使用多个 catch
-es,我们可以根据错误将用户发送到不同的页面。
2.Is 了解所有异常类型及其目的对于编写好代码很重要吗?
就我个人而言,我会选择重要的异常,例如 IO、DB 等,它们可能会导致严重的问题。对于其他人,我会抓住一般例外。
使用多个异常有几个优点:
- 一般异常不会让您知道问题的确切根本原因,尤其是当许多 steps/checks 涉及方法实现时。另外,如果由于各种原因发生异常,则需要从调用方方法实现中抛出不同类型的异常。
例如:您可以抛出自定义异常。
这是您的服务代码:
public void Login(string username, string password)
{
if(string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
{
throw InvalidUserNameException();
}
if(!IsInternetAvaialable())
{
throw NoInternetAvailableException()
}
else
{
//Implement though your login process and if need use various custom exceptions or throw the exception if occurs.
}
}
public class InvalidUserNameException : Exception
{
public InvalidUserNameException()
{
}
public InvalidUserNameException(string message)
: base(message)
{
}
public InvalidUserNameException(string message, Exception inner)
: base(message, inner)
{
}
}
调用方方法:
try {
...
} catch(InvalidUserNameException e) {
// Show Alert Message here
} catch(NoInternetAvaibleException e) {
// Show Alert Message with specific reason
}
catch(Exception e) {
// Other Generic Exception goes here
}
参考:
https://docs.microsoft.com/en-us/dotnet/standard/exceptions/how-to-create-user-defined-exceptions
为什么我们需要多个“catch”块,即使我们可以编写一个泛型 异常?
了解所有异常类型及其目的对于编写好的代码很重要吗?
我在谷歌上搜索了很多,但仍然对异常处理感到困惑。有什么好的例子吗?
一般异常:
try{
//some code
}
catch(Exception e){
//print e
}
//that's it.
多次捕获
try{
//some code
}
catch(IOException e){
}
catch(SQLException e){
}
1.为什么我们需要多个 "catch" 块,即使我们可以编写一个通用异常?
有时您可能需要指定导致问题的原因。
例如,
try {
...
} catch(IOException e) {
// Print "Error: we cannot open your file"
} catch(SQLException e) {
// Print: "Error: we cannot connect to the database"
}
通过不同的错误,用户可以很容易地理解哪里出了问题。
如果我们选择
try {
...
} catch(Exception e) {
// Print "Error: " + e.
}
用户更难找出问题所在。
此外,如果我们使用多个 catch
-es,我们可以根据错误将用户发送到不同的页面。
2.Is 了解所有异常类型及其目的对于编写好代码很重要吗?
就我个人而言,我会选择重要的异常,例如 IO、DB 等,它们可能会导致严重的问题。对于其他人,我会抓住一般例外。
使用多个异常有几个优点:
- 一般异常不会让您知道问题的确切根本原因,尤其是当许多 steps/checks 涉及方法实现时。另外,如果由于各种原因发生异常,则需要从调用方方法实现中抛出不同类型的异常。
例如:您可以抛出自定义异常。
这是您的服务代码:
public void Login(string username, string password)
{
if(string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
{
throw InvalidUserNameException();
}
if(!IsInternetAvaialable())
{
throw NoInternetAvailableException()
}
else
{
//Implement though your login process and if need use various custom exceptions or throw the exception if occurs.
}
}
public class InvalidUserNameException : Exception
{
public InvalidUserNameException()
{
}
public InvalidUserNameException(string message)
: base(message)
{
}
public InvalidUserNameException(string message, Exception inner)
: base(message, inner)
{
}
}
调用方方法:
try {
...
} catch(InvalidUserNameException e) {
// Show Alert Message here
} catch(NoInternetAvaibleException e) {
// Show Alert Message with specific reason
}
catch(Exception e) {
// Other Generic Exception goes here
}
参考: https://docs.microsoft.com/en-us/dotnet/standard/exceptions/how-to-create-user-defined-exceptions