C# 在Angular 2中解释MVC错误的最佳实践

C# 在Angular 2中解释MVC错误的最佳实践,c#,asp.net-mvc,angular,error-handling,C#,Asp.net Mvc,Angular,Error Handling,我有一个用C#编写的MVC5后端。它提供用Razor编写的MVC视图和一些2页的视图 从客户端调用服务器时,处理潜在错误的最佳方法是什么?我真的很想建立一个在所有情况下都有效的模式。以下是我到目前为止所做的尝试 后端C#代码: 客户端2代码: public loadDataFromServer() { let response = this.http.get(this.urlGetData) .map((res: Response) => res.json())

我有一个用C#编写的MVC5后端。它提供用Razor编写的MVC视图和一些2页的视图

从客户端调用服务器时,处理潜在错误的最佳方法是什么?我真的很想建立一个在所有情况下都有效的模式。以下是我到目前为止所做的尝试

后端C#代码:

客户端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);
}
public loadDataFromServer() {
    let response = this.http.get(this.urlGetData)
        .map((res: Response) => res.json())
        .catch(this.handleResponseError);

    response.subscribe(result => {
        if (result.error) {
            this.displayJsonError(this.urlGetUsers, result.error);
        }
        else {
            // Process valid result
        }
    });
};



private handleResponseError(value: Response | any) {
    let errorMessage = value.toString();
    let response = value as Response;
    if (response) {
        errorMessage = `${response.status}: ${response.statusText}\n${response.toString()}`;
    }
    if (value.error) {
        errorMessage = value.error;
    }
    if (value.message) {
        errorMessage = value.message;
    }
    return Observable.throw(errorMessage);
}

private displayJsonError(url: string, error: string) {
    console.error(`Call to '${url}' failed with ${error}`);
}
这是由handleError方法处理的错误对象的打印屏幕:

这一切都提出了一些问题:

  • 从服务器抛出自定义HttpException是否正确
  • handleError方法是正确的还是过于复杂
  • 在客户端,我希望看到定制的错误消息,但目前它只是在一个巨大的HTML“blob”中发现的,很难解析
  • 在获取调用和订阅操作中是否需要客户端错误处理

  • 我目前的建议是让服务器用Json对象响应所有已处理的异常

    在客户端,在处理有效结果之前,我检查结果对象是否存在可能的错误属性

    HandlerResponseError方法将解析类型化响应对象并抛出可观察消息。但至少我的浏览器(Chrome57)似乎能自动将响应错误记录到控制台上。所以,如果订阅服务器不需要对不同的错误进行特定的额外处理,那么订阅服务器就不需要对err对象执行额外的操作

    如果有更好的方法,请反馈

    后端C#代码:

    客户端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);
    }
    
    public loadDataFromServer() {
        let response = this.http.get(this.urlGetData)
            .map((res: Response) => res.json())
            .catch(this.handleResponseError);
    
        response.subscribe(result => {
            if (result.error) {
                this.displayJsonError(this.urlGetUsers, result.error);
            }
            else {
                // Process valid result
            }
        });
    };
    
    
    
    private handleResponseError(value: Response | any) {
        let errorMessage = value.toString();
        let response = value as Response;
        if (response) {
            errorMessage = `${response.status}: ${response.statusText}\n${response.toString()}`;
        }
        if (value.error) {
            errorMessage = value.error;
        }
        if (value.message) {
            errorMessage = value.message;
        }
        return Observable.throw(errorMessage);
    }
    
    private displayJsonError(url: string, error: string) {
        console.error(`Call to '${url}' failed with ${error}`);
    }
    

    如果
    错误
    响应
    对象,您想做什么?这看起来很晦涩,同时也有些过分:-D..@n00dl3 handleError方法取自web。调试时,我发现错误实际上是Response类型的。你认为应该是别的吗?我已经添加了上面的打印输出和当前的错误进行调查。请提供改进建议。