我有一个用C#编写的MVC 5后端。它提供了用Razor编写的MVC视图和一些Angular 2页面。
当从客户端调用服务器时,处理潜在错误的最佳方式是什么?我真的希望建立一个强大且适用于所有情况的模式。以下是我迄今为止尝试过的方法。
后端C#代码:
public class MyController : Controller
{
[HttpGet]
public ActionResult GetUsers()
{
try
{
// Lot of fancy server code ...
throw new Exception("Dummy error");
return GetCompressedResult(json);
}
catch (Exception ex)
{
throw new HttpException(501, ex.Message);
}
}
private FileContentResult GetCompressedResult(string json)
{
// Transform to byte array
var bytes = Encoding.UTF8.GetBytes(json);
// Compress array
var compressedBytes = bytes.Compress();
HttpContext.Response.AppendHeader("Content-encoding", "gzip");
return new FileContentResult(compressedBytes, "application/json");
}
}
客户端 Angular 2 代码:
public loadDataFromServer() {
let response = this.http.get(this.urlGetData)
.map((res: Response) => res.json())
.catch(this.handleError);
response.subscribe(response => {
// Process valid result ...
},
err => { console.error(err); }
);
};
private handleError(error: Response | any) {
let errMsg: string;
if (error instanceof Response) {
const body = JSON.parse(JSON.stringify(error || null))
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
以下是handleError方法处理的错误对象的屏幕截图:
这些都引发了一些问题:
- 从服务器抛出自定义HttpException是否正确?
- handleError方法是否正确或者过于复杂?
- 在客户端我想看到自定义错误消息,但目前它只在一个巨大的“blob”HTML中找到,难以解析。
- 在get调用和subscribe操作中是否都需要进行客户端错误处理?
error
是一个Response
对象,你试图做什么?这看起来相当晦涩和过度设计了 :-D... - n00dl3