ANGULAR
Complete Angular Tutorial For Beginners Introduction to Angular | What is Angular? Architecture Overview & Concepts of Angular How to Install Angular How to Create a new project in Angular Bootstrapping in Angular: How It Works Internally Angular Components Overview & Examples Data Binding in Angular Interpolation in Angular Property Binding in Angular Event Binding in Angular ngModel & Two way Data binding in Angular NgModelChange & Change Event in Angular Child/Nested Components in Angular angular directives angular ngFor directive ngSwitch, ngSwitchcase, ngSwitchDefa ult Angular Example How to use ngIf, else, then in Angular By example NgClass Example Conditionally apply class Angular ngStyle Directive Angular Trackby to improve ngFor Performance How to Create & Use Custom Directive In Angular Working with Angular Pipes How to Create Custom Pipe in Angular Formatting Dates with Angular Date Pipe Using Angular Async Pipe with ngIf & ngFor angular keyValue pipe Using Angular Pipes in Components or Services Angular Component Communication & Sharing Data Angular Pass data to child component Angular Pass data from Child to parent component Component Life Cycle Hooks in Angular Angular ngOnInit And ngOnDestroy Life Cycle hook Angular ngOnChanges life Cycle Hook Angular ngDoCheck Life Cycle Hook Angular Forms Tutorial: Fundamentals & Concep t s Angular Template-driven forms example How to set value in template-driven forms in Angular Angular Reactive Forms Example Using Angular FormBuilder to build Forms SetValue & PatchValue in Angular StatusChanges in Angular Forms ValueChanges in Angular Forms FormControl in Angular FormGroup in Angular Angular FormArray Example Nested FormArray Example Add Form Fields Dynamically SetValue & PatchValue in FormArray Angular Select Options Example in Angular Introduction to Angular Services Introduction to Angular Dependency Injection Angular Injector, @Injectable & @Inject Angular Providers: useClass, useValue, useFactory & useExisting Injection Token in Angular How Dependency Injection & Resolution Works in Angular Angular Singleton Service ProvidedIn root, any & platform in Angular @Self, @SkipSelf & @Optional Decorators Angular '@Host Decorator in Angular ViewProviders in Angular Angular Reactive Forms Validation Custom Validator in Angular Reactive Form Custom Validator with Parameters in Angular Inject Service Into Validator in Angular template_driven_form_validation_in_angular Custom Validator in Template Driven Forms in Angular Angular Async Validator Example Cross Field or Multi Field Validation Angular How to add Validators Dynamically using SetValidators in Angular Angular HttpClient Tutorial & Example Angular HTTP GET Example using httpclient Angular HTTP POST Example URL Parameters, Query Parameters, httpparams in Angular HttpClient Angular HTTPHeaders Example Understanding HTTP Interceptors in Angular Angular Routing Tutorial with Example Location Strategy in Angular Angular Route Params Angular : Child Routes / Nested Route Query Parameters in Angular Angular Pass Data to Route: Dynamic/Static RouterLink, Navigate & NavigateByUrl to Navigate Routes RouterLinkActive in Angular Angular Router Events ActivatedRoute in Angular Angular Guards Tutorial Angular CanActivate Guard Example Angular CanActivateChild Example Angular CanDeactivate Guard Angular Resolve Guard Introduction to Angular Modules or ngModule Angular Routing between modules Angular Folder Structure Best Practices Guide to Lazy loading in Angular Angular Preloading Strategy Angular CanLoad Guard Example Ng-Content & Content Projection in Angular Angular @input, @output & EventEmitter Template Reference Variable in Angular ng-container in Angular How to use ng-template & TemplateRef in Angular How to Use ngTemplateOutlet in Angular '@Hostbinding and @Hostlistener_in_Angular Understanding ViewChild, ViewChildren &erylist in Angular ElementRef in Angular Renderer2 Example: Manipulating DOM in Angular ContentChild and ContentChildren in Angular AfterViewInit, AfterViewChecked, AfterContentInit & AfterContentChecked in Angular Angular Decorators Observable in Angular using RxJs Create observable from a string, array & object in angular Create Observable from Event using FromEvent in Angular Using Angular observable pipe with example Angular Map Operator: Usage and Examples Filter Operator in Angular Observable Tap operator in Angular observable Using SwitchMap in Angular Using MergeMap in Angular Using concatMap in Angular Using ExhaustMap in Angular Take, TakeUntil, TakeWhile & TakeLast in Angular Observable First, Last & Single Operator in Angular Observable Skip, SkipUntil, SkipWhile & SkipLast Operators in Angular The Scan & Reduce operators in Angular DebounceTime & Debounce in Angular Delay & DelayWhen in Angular Using ThrowError in Angular Observable Using Catcherror Operator in Angular Observable ReTryWhen inReTry, ReTryWhen in Angular Observable Unsubscribing from an Observable in Angular Subjects in Angular ReplaySubject, BehaviorSubject & AsyncSubject in Angular Angular Observable Subject Example Sharing Data Between Components Angular Global CSS styles View Encapsulation in Angular Style binding in Angular Class Binding in Angular Angular Component Styles How to Install & Use Angular FontAwesome How to Add Bootstrap to Angular Angular Location Service: go/back/forward Angular How to use APP_INITIALIZER Angular Runtime Configuration Angular Environment Variables Error Handling in Angular Applications Angular HTTP Error Handling Angular CLI tutorial ng new in Angular CLI How to update Angular to latest version Migrate to Standalone Components in Angular Create Multiple Angular Apps in One Project Set Page Title Using Title Service Angular Example Dynamic Page Title based on Route in Angular Meta service in Angular. Add/Update Meta Tags Example Dynamic Meta Tags in Angular Angular Canonical URL Lazy Load Images in Angular Server Side Rendering Using Angular Universal The requested URL was not found on this server error in Angular Angular Examples & Sample Projects Best Resources to Learn Angular Best Angular Books in 2020

Using ThrowError in Angular Observable

Angular ThrowError operator returns an observable, which on subscription immediately errors out. It does not emit any results.

ThrowError

ThrowError creates a new observable. Hence we must subscribe to it. The following example creates an ThrowError observable and then subscribes to it.

                              

import { Component, VERSION } from "@angular/core";
import { Observable, of, from, throwError } from "rxjs";
import { map, catchError } from "rxjs/operators";
 
@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  name = "Angular " + VERSION.major;
 
  obs = throwError("Error From ThrowError observable");
 
  ngOnInit() {
    this.obs.subscribe(
      el => {
        console.log("Value Received :" + el);
      },
      err => {
        console.log("Error caught at Subscriber :" + err);
      },
      () => console.log("Processing Complete")
    );
  }
}
 
 
 
****Console Window
 
Error caught at Subscriber: Error From ThrowError observable
 
                            
                        

First, we create an observable using throwError. The first argument to the throwError is the error object. This error object is passed to the consumers when it raises the error notification.

                              

obs = throwError("Error From ThrowError observable")
                            
                        

We, subscribe to it in the ngOnInit method.

                              
 
this.obs.subscribe(
                            
                        

The observable immediately raises the error notification and completes. The error callback is invoked and we will see the error message in the console window.

                              
 err => {
     console.log("Error caught at Subscriber :" + err);
     },
 
 
                            
                        

Throw Error Vs ThrowError

It is very easy confuse between the Throw Error With ThrowError.

Throw Error throws an error. It is a JavaScript construct and is not part of the RxJs. We need to use the try/catch block to catch the errors thrown from the Throw Error. The RxJS uses the try/catch block to catch any errors thrown from the observables. And when they catch one, they emit an error notification (raises the error callback), and then the observable stops.

ThrowError does not throw errors like throw Error. It returns a new observable, which emit an error notification (raises the error callback), and then stops.

Throw Error Example

                              

import { Component, VERSION } from "@angular/core";
import { Observable, of, from, throwError } from "rxjs";
import { map, catchError } from "rxjs/operators";
 
@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
 
 
  srcArray = from([1, 2, "A", 4]);
 
  obs = this.srcArray.pipe(
    map(val => {
      let result = (val as number) * 2;
      if (Number.isNaN(result)) {
        console.log("Error in the observable");
        throw Error("Not a Number");
      }
      return result;
    })
  );
 
  ngOnInit() {
    this.obs.subscribe(
      el => {
        console.log("Value Received :" + el);
      },
      err => {
        console.log("Error caught at Subscriber :" + err);
      },
      () => console.log("Processing Complete.")
    );
  }
}
 
 
***Console ****
 
Value Received :2
Value Received :4
Error in the observable
Error caught at Subscriber :Error: Not a Number
 
                            
                        

The observable emits values 2 & 4.

When map operators receive the value A it uses throw Error to throw an error. The observable catches this error and raises the error notification and terminates.

The last value 8 is never emitted.

throwerror

Now, let us replace the throw Error with return throwError

                              

import { Component, VERSION } from "@angular/core";
import { Observable, of, from, throwError } from "rxjs";
import { map, catchError } from "rxjs/operators";
 
@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  name = "Angular " + VERSION.major;
 
  srcArray = from([1, 2, "A", 4]);
 
  obs = this.srcArray.pipe(
    map(val => {
      let result = (val as number) * 2;
      if (Number.isNaN(result)) {
        console.log("Error in the observable");
        return throwError("Not a Number");
      }
      return result;
    })
  );
 
  ngOnInit() {
    this.obs.subscribe(
      (el: any) => {
        console.log("Value Received :" + el);
      },
      err => {
        console.log("Error caught at Subscriber :" + err);
      },
      () => console.log("Processing Complete.")
    );
  }
}
 
 
****Console ********
Value Received :2
Value Received :4
Error in the observable
Value Received :[object Object]
Value Received :8
Processing Complete
 
                            
                        

The observable emits values 2 & 4.

When the map operator receive the value A it returns throwError. Remember throwError returns an observable. It will raise the error notification, only if you subscribe to it.

The map operator does not subscribe to the observable. It just returns it to the subscriber.

Hence the subscriber receives the throwError observable as value. Hence you see [object Object] in the console.

Since there is no error raised, the observable continues and emits the next value 8 and then completes.

Using ThrowError

The throwError needs to be subscribed for it to emit error notification. We can use it to compose with other Observables such as mergeMap, switchMap, catchError etc.

Using with catchError

The following example, shows how to use ThrowError with CatchError

                              
 
import { Component, OnInit } from "@angular/core";
import { throwError, from } from "rxjs";
import { map, catchError } from "rxjs/operators";
 
@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  srcArray = from([1, 2, "A", 4]);
 
  obs = this.srcArray.pipe(
    map(val => {
      let result = (val as number) * 2;
      if (Number.isNaN(result)) {
        console.log("Errors Occurred in Stream");
        throw new Error("Result is NaN");
      }
      return result;
    }),
    catchError(error => {
      console.log("Caught in CatchError. Throwing error");
      return throwError(error);
    })
  );
 
  ngOnInit() {
    this.obs.subscribe(
      el => {
        console.log("Value Received " + el);
      },
      err => {
        console.log("Error caught at Subscriber " + err);
      },
      () => console.log("Processing Complete.")
    );
  }
}
 
 
******* CONSOLE ******* 
Value Received 2
Value Received 4
Errors Occurred in Stream
Caught in CatchError. Throwing error
Error caught at Subscriber Error: Result is NaN
 
 
                            
                        

The code throws the error using throw error in map operator.

CatchError will catch this error. We use the CatchError to handle the errors thrown by the Angular Observable. Once we handle the error, we must return an observable. We can either return a replacement observable or return an error. The observable returned from CatchError is immediately subscribed.

Hence we can use the throwError here, which is immediately subscribed , which in turn emits an error notification

                              

    catchError(error => {
      console.log("Caught in CatchError. Throwing error");
      return throwError(error);
    })
 
 
                            
                        

Using it with MergeMap

The Angular MergeMap maps each value from the source observable into an inner observable, subscribes to it, and then starts emitting the values from it.

In the following example, we use throwError to return a observable, when we receive the value 3. The MergeMap subscribes to this new observable and raises the error notification and stops.

                              
 
import { Component, OnInit } from "@angular/core";
import { throwError, of } from "rxjs";
import { map, mergeMap, catchError } from "rxjs/operators";
 
@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  srcObservable = of(1, 2, 3, 4);
  innerObservable = of("A", "B");
 
  obs = this.srcObservable.pipe(
    mergeMap(val => {
      console.log("Source value " + val);
      console.log("starting new observable");
 
      if (val == 3) return throwError("Error in observable");
 
 
      return this.innerObservable;
    })
  );
 
  ngOnInit() {
    this.obs.subscribe(
      el => {
        console.log("Value Received " + el);
      },
      err => {
        console.log("Error caught at Subscriber " + err);
      },
      () => console.log("Processing Complete.")
    );
  }
}
 
 
***Console ****
Source value 1
starting new observable
Value Received A
Value Received B
Source value 2
starting new observable
Value Received A
Value Received B
Source value 3
starting new observable
Error caught at Subscriber Error in observable
 
                            
                        

References